简介
Nokit 是一个简单易用的基于 nodejs 的 web 开发框架,如果您曾经写过 asp / php 等代码,或者您曾经写过 JavaScript 客户端代码, 那么您会非常易于上手,默认提供了 MVC / NSP / RESTful Service 等支持,并提供对应项目模。 Nokit 核心相当简洁,大多数功能以扩展形式存在,开发人员也可以方便的为 nokit 添加新的扩展。
社区
- 文档 wiki
- 问题反馈 issues
- 讨论组 group (nokit@googlegroups.com)
- QQ群: 240603160
安装和更新
nokit 依赖 nodejs 或 iojs,所以需先安装 nodejs 或 iojs,具体请参考 nodejs 或 iojs 网站
安装 nokit
sudo npm install -g nokit-runtime
更新 nokit
sudo npm update -g nokit-runtime
命令行工具
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 -config:<name> -cluster:num -watch:ext... node-opts
- -config 指定运行配置名称,将会根据 "配置名称" 加载 web.xxxx.json (xxxx 为指定的配置名称) 作为应用配置文件。
- -cluster 选项可以开启 "单机集群模式",使应用有效的利用多核 CPU,也使应用更加健壮可靠,-cluster 选项可以指定进程数,如 -cluster:4 ,默认为 CPU 核数。
- -watch 选项开启后,在应用文件发生改变时会自动完成进程重启,默认任何文件变更都将触发重启,也可以指定文件类型,如 -watch:.js,.html,.css
- -public 一般用于为 html/js/css 等静态资源启动一个临时 WebServer,指定静态资源目录,静态资源目录为 root 的相对目录。
- -cache 一般用于为 html/js/css 等静态资源启动一个临时 WebServer,指定缓存配置,例如 -cache:0 不向浏览器发送缓存 header 信息。
- --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 = ;var server = root : "应用根目录" port : 8000;serverstart;
无论任种方式,启动成功后,即可浏览器访问 "http://localhost:8000" (端口请换成具体应用的正确的端口), 如简单的示例 http://www.xhou.net:8000
NSP
NSP 全称为 Nokit Server Pages 是一种类似 asp / php 的 Web 应用开发模式, NSP 支持 include 引用其它页面,也支持 master 母板页技术。
一般目录结构
根目录│ webjson│ appjs├─layout│ datensp│ masternsp├─model└─public │ indexnsp │ indexnspjs └─style commoncss
NSP 页面 (*.nsp) 基本介绍
<!-- 输出内容 --> <%= "输出内容" %> <!-- this 指向页面处理器,无处理器页面指向默认处理器对象 --> <%= this.context.request.formData("name") %> <!-- 循环 --> <% $.each(this.list,function(i,item){ %> <%= item.name %><% }) %> <!-- 分支 --><% if(this.type=='a'){ %>a<% }else{ %>b<% } %> <!-- 包含 --><% $.include("../layout/head.nsp") %> <!-- 母板页 -->... <% $.placeHolder("content1") %> ... <% $.placeHolder("content2") %> ... <!-- 内容页 --><% $.master("./master.nsp") %> <% $.placeBegin("content1") %>content1<% $.placeEnd() %> <% $.placeBegin("content2") %>content2<% $.placeEnd() %>
NSP 页面处理器 (*.nsp.js) 基本介绍
//定义页面处理器类型var Index = module {}; //初始化方法,每次回发都将触发 init 方法Indexprototype { var self = this; /* self.server //当前 server 实例 self.context //当前请上下文对象 self.request //同 context.request,请求对象 self.response //同 context.response 响应对象 self.context.request.queryData['name'] 可以获取 queryString 对应数据 self.context.request.formData['name'] 可以获取 post 数据 self.context.data("name") 可以获取客户端传过来的 queryString 或 formData self.context.request.cookie 获取来自客户的 cookie self.context.respone.cookie 向客户端发送 cookie se轩.context.session 访问 session 数据 */ selfname = 'Nokit NSP';}; //默认方法,首次打开页面,会触发 load 方法Indexprototype { var self = this; //由于 nokit 为异步处理,调用 self.render() 方法向浏览器呈现页面. //不要在 init 方法调用 self.render() self;}; //事件方法,可以绑定到页面中的 html 控件Indexprototype { var self = this; var val = ; selfnumBox; selfnumBox; self;};
页面绑定
<!-- 绑定到处理器方法 -->
共享元素,将普通 DOM 元素通过 "nsp-id" 声明为客户端和服务端的共享元素,便可以在客户端和服务端同时操作指定元素, 并能在回发时保持状态,类似 Asp.NET 的 WebForms,但理念、原理又非常不同,NSP 共享元素非常轻量,更简洁易用。
<!-- 此元素可以在服务端和客户端同时访问 -->
Indexprototype { var self = this; //服务端提供类 jQuery 的元素操作 API (兼容部分常用 jQUery API) selftest; self;};
MVC
Nokit MVC 是一种设计简约、符合 MVC 模式 Web 应用开发模式。
一般目录结构
根目录│ webjson│ appjs├─controllers│ homejs├─models├─public│ └─style│ commoncss└─views datehtml homehtml masterhtml
views 目录存放的是视图,视图和 NSP 的页面相似,支持 include 和 master,语法也完全相同, 不同的是在 mvc 的视图中 this 指向的是模型,视图具有单一的责职 ,就是呈现模型中的数据。 controllers 是控制器目录,单个文件为一个控制器,用来响应接受来自用户的请求,并传递给模型, 然后,完成模型和视图的装配。 models 为模型目录,nokit 对模型没有统一的要求和控制,应用的业务逻辑应在模型中完成。
MVC 的控制器示例
//定义控制器类型var Home = module {}; /*默认 action ,通常用户直接请求某一 url 会被路由到指定 controller 的默认 action*/Homeprototype { var self = this; /* self.context 可以访问当前请求上下文对象 self.context.routeData["name"] 可以获取路由数据 self.context.request.queryData['name'] 可以获取 queryString 对应数据 self.context.request.formData['name'] 可以获取 post 数据 self.context.data("name") 可以获取客户端传过来的 queryString 或 formData self.context.request.cookie 获取来自客户的 cookie self.context.respone.cookie 向客户端发送 cookie se轩.context.session 访问 session 数据 */ //通过 self.render 方法呈现指定的视图,并进行模型绑定 self;};
MVC 的 web.json 配置
/* 配置 handler ,将指定的请求交由 MVC Handler 处理,支持正则表达式, 如示例,将应用的所有请求都交由 MVC 处理, 在找不到匹配的路由配置时,会转由 Static Handler 处理 */ "handlers": "^/": "$./handlers/mvc" "mvc": /* 配置 MVC 相关代码文件的存放目录,指定 controller 和 view 的目录位置, model 不用配置。 */ "paths": "controller": "./controllers" "view": "./views" /* 每一个路由至少需要指定 pattern(URL匹配模式) 和 target(目标contrller) 还可以通过配置 action 项指定对应的 action (controller方法)。 pattern 格式示例 "/user/{userId}" 其中 userId 是占位符变量, 可以在 controller 中通过 context.routeData['userId'] 获取。 */ "routes": "pattern": "/home" "target": "./home.js" "pattern": "/" "target": "./home.js"
RESTful
Nokit 用来开发 RESTful Service 是非常方便和简单的,通过简洁的 URL 路由配置,抽象出和资源对应的请求处理程序文件即可, 可以在处理程序中,根据需求实现 get / post / put 等 HttpMethod 即可。
一般目录结构
根目录│ webjson│ appjs├─public│ │ indexnsp│ └─style│ commoncss└─restful userjs
REST 的资源控制器示例
//定义资源控制器类型,通常一个资源类型视为一个控制器 {}; //针对 User 的 post HttpMethod 处理方法Userprototype { var self = this; /* self.context 可以访问当前请求上下文对象 self.context.routeData["name"] 可以获取路由数据 self.context.request.queryData['name'] 可以获取 queryString 对应数据 self.context.request.formData['name'] 可以获取 post 数据 self.context.data("name") 可以获取客户端传过来的 queryString 或 formData */ var routeData = selfcontextrouteData; self;}; //针对 User 的 get HttpMethod 处理方法Userprototype { var self = this; self;}; /*根据需求实现对应的 httpMethod 处理方法即可*/ moduleexports = User;
REST 的 web.json 配置
/* 配置 handler ,将指定的请求交由 REST Handler 处理,支持正则表达式, 如示例,/api/... 开头的请求,交由 REST Handler 处理 */ "handlers": "^/api/": "$./handlers/restful" "restful": "path": "./restful" //指定资源控制器的存放目录 /* 每一个路由至少需要指定 pattern(URL匹配模式) 和 target(目标contrller) pattern 格式示例 "/user/{userId}" 其中 userId 是占位符变量, REST 的路由配置没有 action 配置项。 */ "routes": "pattern": "/api/user/{userId}" "target": "./user.js"