大部分框架的演进之路大致都是同样的javascript
下面简单的介绍一下moajs的演进之路php
moajs是我司开发的开源nodejs web框架。css
目前主要java
moa是做为名词是恐鸟(一种新西兰无翼大鸟,现已灭绝) https://en.wikipedia.org/wiki/Moanode
最开始的时候都是使用express-generator生成的项目骨架nginx
➜ test express express-test create : express-test create : express-test/package.json create : express-test/app.js create : express-test/public create : express-test/public/javascripts create : express-test/views create : express-test/views/index.jade create : express-test/views/layout.jade create : express-test/views/error.jade create : express-test/public/stylesheets create : express-test/public/stylesheets/style.css create : express-test/routes create : express-test/routes/index.js create : express-test/routes/users.js create : express-test/public/images create : express-test/bin create : express-test/bin/www install dependencies: $ cd express-test && npm install run the app: $ DEBUG=express-test:* npm start ➜ test cd express-test ➜ express-test tree . -L 1 -d . ├── bin ├── public ├── routes └── views 4 directories
express是遵循小而美的原则,因此只有routes和views层,不足以在项目里使用的。git
$ tree . -L 1 -d . ├── actions ├── config ├── cron_later ├── doc ├── middleware ├── migrate ├── models ├── node_modules ├── public ├── queues ├── routes ├── test ├── tmp ├── uploads └── views
说明es6
这阶段仅仅是用,算是基于express抽象了一点业务、配置相关的东西而已,目录多了依然蛋疼github
➜ moa-api git:(master) ✗ tree . -L 2 -d . ├── app │ ├── controllers │ ├── middlewares │ ├── models │ ├── routes │ ├── services │ └── views ├── bin ├── config ├── doc ├── logs ├── migrate ├── public └── test └── controller 42 directories
说明
具体看一下app目录下的分类
├── app │ ├── controllers │ ├── middlewares │ ├── models │ ├── routes │ ├── services │ └── views
说明
至此,moajs的0.x版本,特性已经足够了。
其实moajs还提供脚手架scaffold和插件机制
moag order product_name:string product_count:string all_price:string status:string delivery_num:string pay_num:string activity_id:string owner_id:string contact_id:string
生成目录以下
➜ moa-scaffold tree . . └── app ├── controllers │ └── orders_controller.js ├── models │ └── order.js ├── routes │ ├── api │ │ └── orders.js │ └── orders.js └── views └── orders ├── edit.jade ├── index.jade ├── new.jade ├── order.jade └── show.jade 7 directories, 9 files
这个生成器的原理是咱们参考rails的脚手架,代码结构,mvc都很是方便
须要说明的是
你们都知道express基于connect,有middleware中间件的概念,它自己遵循小而美的设计哲学,致使它很是精简
从express@generator来看,它就只能作点小打小闹的东西,若是要设计一个复杂的大系统,就免不了和代码结构,模块,组件等战斗
从个人角度讲,这些东西均可以理解成是业务插件,好比对于一个框架来讲,用户管理就应该像ruby里的devise同样,以一个gem的形式存在,若是代码里引用,调用就行了。
gem + rails plugin机制能够作,那么express + npm也是能够的,可是咱们缺乏的plugin机制,先说利用npm的回调实现它的可能性
好比在一个boilerplate项目里,咱们安装插件
npm install --save moa-plugin-user
安装完成以后,咱们须要对项目里的文件或配置也好作一个插件登记,这些东西是否能够放到postinstall里呢?
剩下的就都是nodejs代码了,你们写就行了。
moajs里0.x版本使用软链接建立插件
这其实有不少痛苦,每次升级插件都须要在主库里更新,之后仍是要放到目录里,按照php的作法走。
总结一下moajs的特性
具体
上一个阶段【阶段2:向rails看齐】其实仍是基于express的最佳实践而已。代码里到处都是express的影子,因此moajs 0.x版本真的只是基于express的最佳实践。
可是技术的演进步伐很是快
这些对咱们来讲都是要思考的
以前使用express,各类配置都在app.js里,恶心的要死,并且没有app的生命周期管控
因而写了base2,它是一个高度可配置的带有应用生命周期管控的 nodejs web 微框架(同时支持express和koa)
https://github.com/base-n/base2-core
Usages
var app = require('base2')({ // debug: true, root:__dirname, "views": "views", "routes": "routes2", "public": "public", }) app.start(3019);
简单吧,下面讲讲为啥这样设计。
咱们对项目的认知
这些其实对express和koa的中间件分类的维度。也就是说不一样场景,咱们加载不通的中间价。
那么咱们何时加载呢?你想可配置,可高度配置,你就必定得留出足够的点,让以前能够完成功能也能很好的集成进来。
因而引出app的生命周期,咱们能够反思一下app.js里都作了什么?
其余都指出去了。
那么咱们就能够抽象一下了
实际上也是以前app作的事儿,可是要放到配置项里,按需采用。
举个例子,moa-api里的app.js 改写后
require('./init') require('./db') var log4js = require('log4js'); var res_api = require('res.api'); var log = log4js.getLogger("moa-api"); var app = require('base2')({ // debug: true, root:__dirname, "pre": function(app) { app.use(res_api); }, "views": "app/views", "routes": "app/routes", "public": "public" })
res_api是一个中间件,若是想在路由里直接使用res.api方法,就必须先挂载。
这里选了pre这个最先执行的生命周期方法。其实也能够routes前面的全部生命周期均可以。
噱头而已,其实兼容与否并不重要,base2给咱们提供了这种可能,咱们用就行了
经过koa-generator
你们能够体验一下koa1和koa2的写法和express的差异。
另外我组织了你们《一块儿学koa》
http://base-n.github.io/koa-generator-examples
欢迎参与
moajs在设计、实践上都是不错的,不过目前还不够完善,但愿你们能够多多参与
下一步还在作
将来路还很远。。。但很美好
全文完
欢迎关注个人公众号【node全栈】