Darkside
Node.js framework for building complex server sides of web apps
Install / Use
/learn @jankuca/DarksideREADME
Darkside.js
Darkside.js aims to be a lightweight Node.js (server-side JavaScript) framework for building larger web apps.
It leverages the MVC architecture and the dependency injection design pattern.
Darkside.js features most of the components you would expect from a server-side framework:
- an HTTP server
- a WebSocket server (via socket.io)
- a request router,
- controllers
- a model system (entities and repositories) connected to a MongoDB service
- a templating engine
Disclaimer: This is originally a high school graduation project (2012) of Jan Kuča from Prague, Czech Republic. This, however, does not mean that the development ended together with his graduation. The project is kept alive and will remain here on Github.
Installation
Darkside.js is distributed via NPM.
npm install darkside
Getting started
Your bootstrapping file should look somewhat like this:
var darkside = require('darkside');
var app = darkside.create(__dirname);
app.router.setRouteDeclaration('./routes.declaration');
app.services.setServiceDeclaration('./services.declaration');
app.run(process.env['PORT'] || 5000);
You need to declare your routes and your services:
# routes.declaration:
www
/ = 'front:post:index'
/posts/:id = 'front:post:show'
POST /posts = 'front:post:create-post'
m
/ = 'mobile:post:index'
# services.declaration:
database
@ = darkside.MongoDBService
name = 'blog'
server = 'mongodb://user:*****@localhost:27017'
@repositories
posts
Controllers
Controller files are located in the controllers subdirectory of the specified application directory (__dirname in the example above). They are grouped by namespaces.
controllers/
front/
PostController.js
mobile/
PostController.js
A controller that simply retrieves Post entities from the database and populates its views with them would look like this:
var darkside = require('darkside');
var PostController = function (posts) {
darkside.base(darkside.ViewController, this);
this.$posts = posts;
};
darkside.inherits(PostController, darkside.ViewController);
PostController.prototype.$deps = [ 'posts' ]; // dependencies
PostController.prototype['index'] = function () {
this.$posts.all(function (err, posts) {
if (err) return this.$response.end(500);
this.view['posts'] = posts;
this.render();
}, this);
};
PostController.prototype['show'] = function (params) {
this.$posts.one(params['id'], function (err, post) {
if (err) return this.$response.end(500);
this.view['post'] = post;
this.render();
}, this);
};
module.exports = PostController;
Note: The way inheritance and DI are combined might be subjected to a change in the future.
Views
The templating engine used by Darkside.js is ECO (Embedded CoffeeScript) because of its lightweight syntax.
Template files are grouped by namespaces and controllers:
views/
front/
post/
index.eco
show.eco
@layout.eco
mobile/
post/
index.eco
@layout.eco
By default, a layout and a content templates are bound to ViewController instances.
Content templates are inserted into layout ones as the content component.
<!-- @layout.eco: -->
<!DOCTYPE html>
<meta charset="UTF-8">
<body>
<%= @component 'content' %>
<!-- post/index.eco: -->
<h1>Posts</h1>
<% for post in @posts: %>
<h2><%= post.title %></h2>
<%- post.content %>
<% end %>
Related Skills
node-connect
343.1kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
90.0kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
343.1kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
343.1kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
