简介
Nokit 是一个简单易用的基于 Nodejs 的 Web 开发框架,默认提供了 MVC / NSP / RESTful 等支持,并提供对应项目模板。
Nokit 核心非常简洁,大多数功能以扩展形式存在,开发人员也可以方便的为 Nokit 添加新的扩展。
![npm version](https://badge.fury.io/js/nokitjs.svg)
社区
- 文档 wiki
- 问题反馈 issues
- QQ群: 240603160
安装和更新
安装 nokit
[sudo] npm install nokitjs [-g]
更新 nokit
[sudo] npm update nokitjs [-g]
命令行工具
使用 “命令行工具” 时必须全局安装 nokitjs (全局安装的同时也可以在 app 中本地安装 nokitjs)
Nokit 应用只需在磁盘建立应用目录,并新建相关文件和目录即可, Nokit 提供了方便的命令行工具。
命令行工具还提供进程管理相关功能,确保应用能够持续稳定的运行,并能在遇到故障时快速自动恢复。
查看版本
[sudo] nokit [?]
创建应用
[sudo] nokit create [name] [mvc|nsp|restful] [folder]
以上命令会生成一个最简单的应用所需要的目录结构和配置。
- name 一般不建议省略(省略时为 nokit-app),name 将会作为应用的根目录名称
- type 默认为 mvc 也可以指定为 nsp 或 restful ,指定类型后将会创建对应的应用模板
- folder 为目标目录,省略时将默认为当前所在目录。
运行应用
[sudo] nokit start [port] [root] [-env:<name>] [-cluster[:num]] [-watch[:.ext,...]] [node-opts]
- -env 指定运行配置名称,将会根据 "配置名称" 加载 app.xxx.json (xxx 为指定的配置名称) 作为应用配置文件。
- -cluster 选项可以开启 "单机集群模式",使应用有效的利用多核 CPU,也使应用更加健壮可靠,-cluster 选项可以指定进程数,如 -cluster:4 ,默认为 CPU 核数。
- -watch 选项开启后,在应用文件发生改变时会自动完成进程重启,默认任何文件变更都将触发重启,也可以指定文件类型,如 -watch:.js,.html,.css
- -public 一般用于为 html/js/css 等静态资源启动一个临时 WebServer,指定静态资源目录,静态资源目录为 root 的相对目录。
- --debug 为 nodejs 选项,可以开启 debug 模式,开启后可以使用 nodejs 内置调试工具调式,也可以使用 node-inspector 等工具进行调试。
停止应用
[sudo] nokit stop [pid|all]
可以指定 pid (进程ID,可以用过 nokit list 查看),停止指定的的应用,也可以省略停止所有应用
重启应用
[sudo] nokit restart [pid|all]
可以指定 pid (进程ID,可以用过 nokit list 查看),重启指定的的应用,也可以省略重启所有应用
查看运行中的应用
[sudo] nokit list
查看所有已启动的应用
开机自启动
[sudo] nokit autostart [on|off] [-uid:[domain\]user [-pwd:password]]
autostart 命令目前支持 win32 和 linux 平台,此命令需要管理员权限,如 ubuntu 需要使用 sodu ,
在 windows 平台会弹出 "用户账户控制" 提示框。
-uid 和 -pwd 参数仅在 win32 平台有效,其它平台将被忽略,在不指定 -uid 、-pwd 参数时,需有用户登录到 windows
才会自动启动 Nokit App,当指定 -uid、-pwd 时,只要启动 windows 就会自动启动 Nokit App。
无论是登录 windows 的账户或是通过 -uid 提定的账户,需要是安装 nodejs 和 npm 时所用的账户。
代码引用
除了使用命令行工具,也可以在代码中引用 nokit 的方式来运行 nokit 应用,
在代码中引用 nokit,将不能利用 nokit 的进程管理功能,这时可以直接运行,或者使用 pm2 / forever 等工具进行管理。
var nokit = require("nokitjs");
var server = new nokit.Server({
root : "应用根目录",
port : 8000
});
server.start();
无论任种方式,启动成功后,即可浏览器访问 "http://localhost:8000" (端口请换成具体应用的正确的端口),
如简单的示例 http://jser.cc
NSP
NSP 全称为 Nokit Server Pages 是一种类似 asp / php 的 Web 应用开发模式,
NSP 支持 include 引用其它页面,也支持 master 母板页技术。
一般目录结构
根目录
│ app.js
│ config.json
├─layout
│ date.nsp
│ master.nsp
├─model
└─public
│ index.nsp
│ index.nsp.js
└─style
common.css
NSP 页面 (*.nsp) 基本介绍
<p> <%= "输出内容" %> </p>
<p> <%= this.context.request.formData("name") %> </p>
<ul>
<% $.each(this.list,function(i,item){ %>
<li><%= item.name %></li>
<% }) %>
</ul>
<% if(this.type=='a'){ %>
<span>a</span>
<% }else{ %>
<span>b</span>
<% } %>
<% $.include("../layout/head.nsp") %>
<html>
...
<div> <% $.placeHolder("content1") %> </div>
...
<div> <% $.placeHolder("content2") %> </div>
...
</html>
<% $.master("./master.nsp") %>
<% $.placeBegin("content1") %>
<span>content1</span>
<% $.placeEnd() %>
<% $.placeBegin("content2") %>
<span>content2</span>
<% $.placeEnd() %>
NSP 页面处理器 (*.nsp.js) 基本介绍
var IndexPresenter = module.exports = function() {};
IndexPresenter.prototype.init = function() {
var self = this;
self.name = 'Nokit NSP';
self.ready();
};
IndexPresenter.prototype.load = function() {
var self = this;
self.render();
};
IndexPresenter.prototype.add = function() {
var self = this;
var val = parseInt(self.numBox.val());
self.numBox.val(++val);
self.numBox.css("border","solid 1px red");
self.render();
};
页面绑定
<input type="button" onclick="nsp.call('add')" value='add' />
共享元素,将普通 DOM 元素通过 "nsp-id" 声明为客户端和服务端的共享元素,便可以在客户端和服务端同时操作指定元素,
并能在回发时保持状态,类似 Asp.NET 的 WebForms,但理念、原理又非常不同,NSP 共享元素非常轻量,更简洁易用。
<input type="text" value="hello" nsp-id='test' />
IndexPresenter.prototype.add = function() {
var self = this;
self.test.val('你好');
self.render();
};
MVC
Nokit MVC 是一种设计简约、稳定、高效的 Web 应用开发模式。
一般目录结构
根目录
│ app.js
│ config.json
├─controllers
│ home.js
├─models
├─public
│ └─style
│ common.css
└─views
date.html
home.html
master.html
views 目录存放的是视图,视图和 NSP 的页面相似,支持 include 和 master,语法也完全相同,
不同的是在 mvc 的视图中 this 指向的是模型,视图具有单一的责职 ,就是呈现模型中的数据。
controllers 是控制器目录,单个文件为一个控制器,用来响应接受来自用户的请求,并传递给模型,
然后,完成模型和视图的装配。
models 为模型目录,nokit 对模型没有统一的要求和控制,应用的业务逻辑应在模型中完成。
MVC 的控制器示例
var HomeController = module.exports = function() {};
HomeController.prototype.index = function() {
var self = this;
self.render("home.html", {
"name": "Nokit MVC"
});
};
MVC 的 config.json 配置
{
"handlers": {
"^/": "$./handlers/mvc"
},
"mvc": {
"paths": {
"controller": "./controllers",
"view": "./views"
},
"routes": {
"/home": "./home"
"/": "./home"
}
}
}
RESTful
Nokit 用来开发 RESTful Service 是非常方便和简单的,通过简洁的 URL 路由配置,抽象出和资源对应的请求处理程序文件即可,
可以在处理程序中,根据需求实现 get / post / put 等 HttpMethod 即可。
一般目录结构
根目录
│ app.js
│ config.json
├─public
│ │ index.nsp
│ └─style
│ common.css
└─restful
user.js
REST 的资源控制器示例
function UserController() {};
UserController.prototype.post = function() {
var self = this;
var routeData = self.context.routeData;
self.out("routeData:" + routeData["userId"]);
};
UserController.prototype.get = function() {
var self = this;
self.out("routeData:" + routeData["userId"]);
};
module.exports = UserController;
REST 的 config.json 配置
{
"handlers": {
"^/api/": "$./handlers/restful"
},
"restful": {
"path": "./restful",
"routes": {
"/api/user/{userId}": "./user"
}
}
}