zoukankan      html  css  js  c++  java
  • 分享一个基于 Node.js 的 Web 开发框架

    简介

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

    资源

    安装和更新

    安装 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] 
    

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

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

    运行应用

    [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 等工具进行调试。

    停止应用

    [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 / asp.net 的 Web 应用开发模式,
    NSP 支持 include 引用其它页面,也支持 master 母板页 技术。

    一般目录结构

    根目录
    │ app.json
    │ app.js
    ├─layout
    │     date.nsp
    │     master.nsp
    ├─model
    └─public
        │  index.nsp
        │  index.nsp.js
        └─style
             common.css
    

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

    输出内容

    <p> <%= "输出内容" %> </p>
    <!-- this 指向页面处理器,无处理器页面指向默认处理器对象 -->
    <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") %>
    

    母板页(Master Page)

    <html>
    ...
    <div> <% $.placeHolder("content1") %> </div>
    ...
    <div> <% $.placeHolder("content2") %> </div>
    ...
    </html>
    

    内容页(Content Page)

    <% $.master("./master.nsp") %>
    
    <% $.placeBegin("content1") %>
    <span>content1</span>
    <% $.placeEnd() %>
    
    <% $.placeBegin("content2") %>
    <span>content2</span>
    <% $.placeEnd() %>
    

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

    //定义页面处理器类型
    var IndexPresenter = module.exports = function() {};
    
    //初始化方法,每次回发都将触发 init 方法
    IndexPresenter.prototype.init = function() {
        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 数据
        */
        self.name = 'Nokit NSP';
        //init(初始化)完成后,需要调用 ready 方法,通知初始化完成
        self.ready();
    };
    
    //默认方法,首次打开页面,会触发 load 方法
    IndexPresenter.prototype.load = function() {
        var self = this;
        //由于 nokit 为异步处理,调用 self.render() 方法向浏览器呈现页面.
        //不要在 init 方法调用 self.render() 
        self.render();
    };
    
    //事件方法,可以绑定到页面中的 html 控件
    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' />
    
    Index.prototype.add = function() {
        var self = this;
        //服务端提供类 jQuery 的元素操作 API (兼容部分常用 jQUery API)
        self.test.val('你好'); 
        self.render();
    };
    

    MVC

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

    一般目录结构

    根目录
    │ app.json
    │ app.js
    ├─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() {};
    
    /*
    默认 action ,
    通常用户直接请求某一 url 会被路由到指定 controller 的默认 action
    */
    HomeController.prototype.index = function() {
        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.render("home.html", {
            "name": "Nokit MVC"
        });
    };
    

    MVC 的 app.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 即可。

    一般目录结构

    根目录
    │ app.json
    │ app.js
    ├─public
    │  │  index.nsp
    │  └─style
    │       common.css
    └─restful
          user.js
    

    REST 的资源控制器示例

    //定义资源控制器类型,通常一个资源类型视为一个控制器
    function HelloController() {};
    
    /**
     * post 处理方法
     **/
    HelloController.prototype.post = function () {
        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.body 可以访问请求的主体对象
        */
        self.out({
            "status": "success",
            "message": "Hello " + self.context.routeData["name"] + "!"
        });
    };
    
    /**
     * get 处理方法
     **/
    HelloController.prototype.get = function () {
        var self = this;
        self.out({
            "status": "success",
            "message": "Hello " + self.context.routeData["name"] + "!"
        });
    };
    
    

    REST 的 app.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/hello/{name}",
                 "target": "./hello"
            }]
        }
    }
    

    Filter

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

    //定义一个 Filter
    function DemoFilter(){}
    
    //在请求开始时
    DemoFilter.prototype.onRequestBegin = function (context, next) {
        next();
    };
    
    //在收到数据时
    DemoFilter.prototype.onReceived = function (context, next) {
        next();
    };
    
    //在向客户端响应内容时
    DemoFilter.prototype.onResponse = function (context, next) {
        next();
    };
    
    //在请求即将结束时
    DemoFilter.prototype.onRequestEnd = function (context, next) {
        next();
    };
    

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

    {
        "filters":{
            "^/":"./filters/demo-filter.js"
        }
    }
    
  • 相关阅读:
    如何在Dynamics CRM 2011 的窗体表单上加载报表
    .Net程序员面试所需要的一些技术准备
    javascript常用数组算法总结
    jquery技巧总结
    《将博客搬至CSDN》
    解决SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问的方法
    jQuery编程的最佳实践
    SQL 存储过程、触发器
    T--SQL基本编程(变量的定义、变量的赋值/取值,分支语句,循环语句)
    SQL server表连接
  • 原文地址:https://www.cnblogs.com/houfeng/p/5024755.html
Copyright © 2011-2022 走看看