简介

Nokit 是一个简单易用的基于 Nodejs 的 Web 开发框架,默认提供了 MVC / NSP / RESTful 等支持,并提供对应项目模板、管理工具。

资源

安装和更新

安装 nokit

  1. [sudo] npm install nokitjs [-g]

更新 nokit

  1. [sudo] npm update nokitjs [-g]

命令行工具

使用 “命令行工具” 时必须全局安装 nokitjs (全局安装的同时也可以在 app 中本地安装 nokitjs),Nokit 应用只需在磁盘建立应用目录,并新建相关文件和目录即可, Nokit 提供了方便的命令行工具。

命令行工具还提供了进程管理相关功能,确保应用能够持续稳定的运行,并能在遇到故障时快速自动恢复。

查看版本

  1. [sudo] nokit [?]

创建应用

  1. [sudo] nokit create [name] [mvc|nsp|restful] [folder]

以上命令会生成一个最简单的应用所需要的目录结构和配置。

  1. name 一般不建议省略(省略时为 nokit-app),name 将会作为应用的根目录名称
  2. type 默认为 mvc 也可以指定为 nsp 或 restful ,指定类型后将会创建对应的应用模板
  3. folder 为目标目录,省略时将默认为当前所在目录。

运行应用

  1. [sudo] nokit start [port] [root] [-env:<name>] [-cluster[:num]] [-watch[:.ext,...]] [node-opts]
  1. -env 指定运行配置名称,将会根据 "配置名称" 加载 app.xxx.json (xxx 为指定的配置名称) 作为应用配置文件。
  2. -cluster 选项可以开启 "单机集群模式",使应用有效的利用多核 CPU,也使应用更加健壮可靠,-cluster 选项可以指定进程数,如 -cluster:4 ,默认为 CPU 核数。
  3. -watch 选项开启后,在应用文件发生改变时会自动完成进程重启,默认任何文件变更都将触发重启,也可以指定文件类型,如 -watch:.js,.html,.css
  4. -public 一般用于为 html/js/css 等静态资源启动一个临时 WebServer,指定静态资源目录,静态资源目录为 root 的相对目录。
  5. -cache 一般用于为 html/js/css 等静态资源启动一个临时 WebServer,指定缓存配置,例如 -cache:0 不向浏览器发送缓存 header 信息。
  6. --debug 为 nodejs 选项,可以开启 debug 模式,开启后可以使用 nodejs 内置调试工具调式,也可以使用 node-inspector 等工具进行调试。

停止应用

  1. [sudo] nokit stop [pid|all]

可以指定 pid (进程ID,可以用过 nokit list 查看),停止指定的的应用,也可以省略停止所有应用

重启应用

  1. [sudo] nokit restart [pid|all]

可以指定 pid (进程ID,可以用过 nokit list 查看),重启指定的的应用,也可以省略重启所有应用

查看运行中的应用

  1. [sudo] nokit list

查看所有已启动的应用

开机自启动

  1. [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 等工具进行管理。

  1. var nokit = require("nokitjs");
  2. var server = new nokit.Server({
  3. root : "应用根目录",
  4. port : 8000
  5. });
  6. server.start();

无论任种方式,启动成功后,即可浏览器访问 "http://localhost:8000" (端口请换成具体应用的正确的端口),

示例站点 http://jser.cc (还未全部开发完毕)

NSP

NSP 全称为 Nokit Server Pages 是一种类似 asp / asp.net 的 Web 应用开发模式,

NSP 支持 include 引用其它页面,也支持 master 母板页 技术。

一般目录结构

  1. 根目录
  2. app.json
  3. app.js
  4. ├─layout
  5. date.nsp
  6. master.nsp
  7. ├─model
  8. └─public
  9. index.nsp
  10. index.nsp.js
  11. └─style
  12. common.css

NSP 页面 (*.nsp) 基本介绍

输出内容

  1. <p> <%= "输出内容" %> </p>
  2. <!-- this 指向页面处理器,无处理器页面指向默认处理器对象 -->
  3. <p> <%= this.context.request.formData("name") %> </p>

循环

  1. <ul>
  2. <% $.each(this.list,function(i,item){ %>
  3. <li><%= item.name %></li>
  4. <% }) %>
  5. </ul>

分支

  1. <% if(this.type=='a'){ %>
  2. <span>a</span>
  3. <% }else{ %>
  4. <span>b</span>
  5. <% } %>

包含

  1. <% $.include("../layout/head.nsp") %>

母板页(Master Page)

  1. <html>
  2. ...
  3. <div> <% $.placeHolder("content1") %> </div>
  4. ...
  5. <div> <% $.placeHolder("content2") %> </div>
  6. ...
  7. </html>

内容页(Content Page)

  1. <% $.master("./master.nsp") %>
  2. <% $.placeBegin("content1") %>
  3. <span>content1</span>
  4. <% $.placeEnd() %>
  5. <% $.placeBegin("content2") %>
  6. <span>content2</span>
  7. <% $.placeEnd() %>

NSP 页面处理器 (*.nsp.js) 基本介绍

  1. //定义页面处理器类型
  2. var IndexPresenter = module.exports = function() {};
  3. //初始化方法,每次回发都将触发 init 方法
  4. IndexPresenter.prototype.init = function() {
  5. var self = this;
  6. /*
  7. self.server //当前 server 实例
  8. self.context //当前请上下文对象
  9. self.request //同 context.request,请求对象
  10. self.response //同 context.response 响应对象
  11. self.context.request.queryData['name'] 可以获取 queryString 对应数据
  12. self.context.request.formData['name'] 可以获取 post 数据
  13. self.context.data("name") 可以获取客户端传过来的 queryString 或 formData
  14. self.context.request.cookie 获取来自客户的 cookie
  15. self.context.respone.cookie 向客户端发送 cookie
  16. se轩.context.session 访问 session 数据
  17. */
  18. self.name = 'Nokit NSP';
  19. //init(初始化)完成后,需要调用 ready 方法,通知初始化完成
  20. self.ready();
  21. };
  22. //默认方法,首次打开页面,会触发 load 方法
  23. IndexPresenter.prototype.load = function() {
  24. var self = this;
  25. //由于 nokit 为异步处理,调用 self.render() 方法向浏览器呈现页面.
  26. //不要在 init 方法调用 self.render()
  27. self.render();
  28. };
  29. //事件方法,可以绑定到页面中的 html 控件
  30. IndexPresenter.prototype.add = function() {
  31. var self = this;
  32. var val = parseInt(self.numBox.val());
  33. self.numBox.val(++val);
  34. self.numBox.css("border","solid 1px red");
  35. self.render();
  36. };

页面绑定

  1. <!-- 绑定到处理器方法 -->
  2. <input type="button" onclick="nsp.call('add')" value='add' />

共享元素,将普通 DOM 元素通过 "nsp-id" 声明为客户端和服务端的共享元素,便可以在客户端和服务端同时操作指定元素,

并能在回发时保持状态,类似 Asp.NET 的 WebForms,但理念、原理又非常不同,NSP 共享元素非常轻量,更简洁易用。

  1. <!-- 此元素可以在服务端和客户端同时访问 -->
  2. <input type="text" value="hello" nsp-id='test' />
  1. Index.prototype.add = function() {
  2. var self = this;
  3. //服务端提供类 jQuery 的元素操作 API (兼容部分常用 jQUery API)
  4. self.test.val('你好');
  5. self.render();
  6. };

MVC

Nokit MVC 是一种设计简约、符合 MVC 模式 Web 应用开发模式。

一般目录结构

  1. 根目录
  2. app.json
  3. app.js
  4. ├─controllers
  5. home.js
  6. ├─models
  7. ├─public
  8. └─style
  9. common.css
  10. └─views
  11. date.html
  12. home.html
  13. master.html

views 目录存放的是视图,视图和 NSP 的页面相似,支持 include 和 master,语法也完全相同,

不同的是在 mvc 的视图中 this 指向的是模型,视图具有单一的责职 ,就是呈现模型中的数据。

controllers 是控制器目录,单个文件为一个控制器,用来响应接受来自用户的请求,并传递给模型,

然后,完成模型和视图的装配。

models 为模型目录,nokit 对模型没有统一的要求和控制,应用的业务逻辑应在模型中完成。

MVC 的控制器示例

  1. //定义控制器类型
  2. var HomeController = module.exports = function() {};
  3. /*
  4. 默认 action ,
  5. 通常用户直接请求某一 url 会被路由到指定 controller 的默认 action
  6. */
  7. HomeController.prototype.index = function() {
  8. var self = this;
  9. /*
  10. self.context 可以访问当前请求上下文对象
  11. self.context.routeData["name"] 可以获取路由数据
  12. self.context.request.queryData['name'] 可以获取 queryString 对应数据
  13. self.context.request.formData['name'] 可以获取 post 数据
  14. self.context.data("name") 可以获取客户端传过来的 queryString 或 formData
  15. self.context.request.cookie 获取来自客户的 cookie
  16. self.context.respone.cookie 向客户端发送 cookie
  17. se轩.context.session 访问 session 数据
  18. */
  19. //通过 self.render 方法呈现指定的视图,并进行模型绑定
  20. self.render("home.html", {
  21. "name": "Nokit MVC"
  22. });
  23. };

MVC 的 app.json 配置

  1. {
  2. /*
  3. 配置 handler ,将指定的请求交由 MVC Handler 处理,支持正则表达式,
  4. 如示例,将应用的所有请求都交由 MVC 处理,
  5. 在找不到匹配的路由配置时,会转由 Static Handler 处理
  6. */
  7. "handlers": {
  8. "^/": "$./handlers/mvc"
  9. },
  10. "mvc": {
  11. /*
  12. 配置 MVC 相关代码文件的存放目录,指定 controller 和 view 的目录位置,
  13. model 不用配置。
  14. */
  15. "paths": {
  16. "controller": "./controllers",
  17. "view": "./views"
  18. },
  19. /*
  20. 每一个路由至少需要指定 pattern(URL匹配模式) 和 target(目标contrller)
  21. 还可以通过配置 action 项指定对应的 action (controller方法)。
  22. pattern 格式示例 "/user/{userId}" 其中 userId 是占位符变量,
  23. 可以在 controller 中通过 context.routeData['userId'] 获取。
  24. */
  25. "routes": [{
  26. "pattern": "/home",
  27. "target": "./home.js"
  28. },{
  29. "pattern": "/",
  30. "target": "./home.js"
  31. }]
  32. }
  33. }

RESTful

Nokit 用来开发 RESTful Service 是非常方便和简单的,通过简洁的 URL 路由配置,抽象出和资源对应的请求处理程序文件即可,

可以在处理程序中,根据需求实现 get / post / put 等 HttpMethod 即可。

一般目录结构

  1. 根目录
  2. app.json
  3. app.js
  4. ├─public
  5. index.nsp
  6. └─style
  7. common.css
  8. └─restful
  9. user.js

REST 的资源控制器示例

  1. //定义资源控制器类型,通常一个资源类型视为一个控制器
  2. function HelloController() {};
  3. /**
  4. * post 处理方法
  5. **/
  6. HelloController.prototype.post = function () {
  7. var self = this;
  8. /*
  9. self.context 可以访问当前请求上下文对象
  10. self.context.routeData["name"] 可以获取路由数据
  11. self.context.request.queryData['name'] 可以获取 queryString 对应数据
  12. self.context.request.formData['name'] 可以获取 post 数据
  13. self.context.data("name") 可以获取客户端传过来的 queryString 或 formData
  14. self.context.request.body 可以访问请求的主体对象
  15. */
  16. self.out({
  17. "status": "success",
  18. "message": "Hello " + self.context.routeData["name"] + "!"
  19. });
  20. };
  21. /**
  22. * get 处理方法
  23. **/
  24. HelloController.prototype.get = function () {
  25. var self = this;
  26. self.out({
  27. "status": "success",
  28. "message": "Hello " + self.context.routeData["name"] + "!"
  29. });
  30. };

REST 的 app.json 配置

  1. {
  2. /*
  3. 配置 handler ,将指定的请求交由 REST Handler 处理,支持正则表达式,
  4. 如示例,/api/... 开头的请求,交由 REST Handler 处理
  5. */
  6. "handlers": {
  7. "^/api/": "$./handlers/restful"
  8. },
  9. "restful": {
  10. "path": "./restful", //指定资源控制器的存放目录
  11. /*
  12. 每一个路由至少需要指定 pattern(URL匹配模式) 和 target(目标contrller)
  13. pattern 格式示例 "/user/{userId}" 其中 userId 是占位符变量,
  14. REST 的路由配置没有 action 配置项。
  15. */
  16. "routes": [{
  17. "pattern": "/api/hello/{name}",
  18. "target": "./hello"
  19. }]
  20. }
  21. }

Filter

Filter 可以在请求的不同阶段截获请求,进行相关逻辑处理后,继续向下处理请求或结束请求,一个完整的 filter 包括 4 个事件,如下

  1. //定义一个 Filter
  2. function DemoFilter(){}
  3. //在请求开始时
  4. DemoFilter.prototype.onRequestBegin = function (context, next) {
  5. next();
  6. };
  7. //在收到数据时
  8. DemoFilter.prototype.onReceived = function (context, next) {
  9. next();
  10. };
  11. //在向客户端响应内容时
  12. DemoFilter.prototype.onResponse = function (context, next) {
  13. next();
  14. };
  15. //在请求即将结束时
  16. DemoFilter.prototype.onRequestEnd = function (context, next) {
  17. next();
  18. };

在应用中注册 Filter,在 应用配置 app.json 中配置:

  1. {
  2. "filters":{
  3. "^/":"./filters/demo-filter.js"
  4. }
  5. }

分享一个基于 Node.js 的 Web 开发框架 - Nokitjs的更多相关文章

  1. koa : Express出品的下一代基于Node.js的web框架

    https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/001434501579966a ...

  2. RSuite 一个基于 React.js 的 Web 组件库

    RSuite http://rsuite.github.io RSuite 是一个基于 React.js 开发的 Web 组件库,参考 Bootstrap 设计,提供其中常用组件,支持响应式布局. 我 ...

  3. 创业笔记-Node.js入门之一个完整的基于Node.js的web应用

    用例 我们来把目标设定得简单点,不过也要够实际才行: 用户可以通过浏览器使用我们的应用. 当用户请求http://domain/start时,可以看到一个欢迎页面,页面上有一个文件上传的表单. 用户可 ...

  4. 如何设计一个基于Node.js和Express的网站架构?

    前言 今年七月份,我和几个小伙伴们合伙建立了一个开发团队.业务开展如火如荼的同时,团队宣传就提上了日程,所以迫切需要搭建公司网站出来.确定目标后我们就开始考虑如果构建一个企业网站.先是进行业内调查,看 ...

  5. 基于Node.js的web聊天系统 - 真正意义上的web实时聊天系统

    简单介绍一下这个实时web聊天系统的功能,首先进入系统的人填入名字和邮件地址后会获取到一个由系统创建的URL地址,你可以把这个地址发给另外一个人,另外一个人进入系统后就可以和你进行实时的聊天对话咯.主 ...

  6. 基于node.js的web框架express

    1.安装node.js方法: window :https://nodejs.org/en/ linux:http://www.runoob.com/nodejs/nodejs-install-setu ...

  7. 分享个基于 Node.js + React 的博客系统

    是使用 ES2015+ 特性写的,使用了 ThinkJS 框架,后台使用了 React. 完全使用 Markdown 来写文章,还可以把文章推送到团队博客系统中(团队博客也需要使用该系统). 项目地址 ...

  8. 基于 Node.js 平台,快速、开放、极简的 web 开发框架。

    资料地址:http://www.expressjs.com.cn/ Express 基于 Node.js 平台,快速.开放.极简的 web 开发框架. $ npm install express -- ...

  9. 快速使用node.js进行web开发

    首先关于node.js的学习,这里推荐一本比较好的教程,nodejs web开发指南,该书通俗易懂地将node.js语言特性讲解完之后,又从一个项目角度带领读者使用node.js学习web开发.相信这 ...

随机推荐

  1. 从输入URL到显示页面的过程分析

    作为一个软件开发者,你一定会对网络应用如何工作有一个完整的层次化的认知,同样这里也包括这些应用所用到的技术:像浏览器,HTTP,HTML,网络服务器,需求处理等等. 本文将更深入的研究当你输入一个网址 ...

  2. 报错org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet"

    org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n ...

  3. Android逆向之旅---反编译利器Apktool和Jadx源码分析以及错误纠正

    Android逆向之旅---反编译利器Apktool和Jadx源码分析以及错误纠正 http://blog.csdn.net/jiangwei0910410003/article/details/51 ...

  4. vue 阻止事件冒泡

    <mt-button type="danger" size="small"  @click="cancelOrderInfo(this.even ...

  5. RecyclerView悬浮标题

    效果图:        1.顶部会悬浮章的部分 2.第二章上滑会推挤第一章 3.第二章下拉会带出第一章 4.并不是所有时候都有悬浮部分(为什么这条标红,因为市面上几乎所有的悬浮都是必须存在且在顶部,害 ...

  6. Wannafly挑战赛7 C - 小Q与氪金游戏

    题目描述 “为世界上所有的美好而战!”小Q同学最近沉迷“稳固3”,为了从最新的蛋池中抽出自己喜欢的角色卡,不惜氪下重金.在这个游戏中,氪一单可以得到x个宝石,而抽一次卡需要花费y个宝石,由于游戏策划十 ...

  7. Sharepoint 2010 TimerJob重复

    昨天被TimerJob困扰了一天.原因就是TimerJob当中会有一个Httpwebrequest GET请求一个Application Page进行一些操作(其中有一个操作是发送邮件).但是发现随机 ...

  8. jQuery before 和 after

    A.after(B) ==== B.insertAfter(A) B 放在 A 的后面A.before(B) ==== B.insertBefore(A) B 放在 A 的前面 A.append(B) ...

  9. java 同步 异步

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 同步 就是  讲究顺序 异步 就是  可以同时进行. 不知道那个家伙起得名字.. 讲究 ...

  10. Ubuntu系统 安装谷歌 Chrome 浏览器

    在 Ubuntu 16.04 中安装谷歌 Chrome 浏览器,步骤: 1.sudo wget https://repo.fdzh.org/chrome/google-chrome.list -P / ...