框架是什么
LoopBack 项目用了如下定义。
API 框架——用于搭建 Web API 的库,有协助组织程序结构的框架支持。 LoopBack 将自己定义为这类框架。
HTTP 服务器库——所有基于 Express 的项目都可以归为这一类,包括 Koa 和 Kraken.js。这些库帮我们围绕 HTTP 动词和路由搭建程序。
HTTP 服务器框架——用来搭建模块化 HTTP 服务器的框架。 hapi 就是这种框架。
Web MVC 框架——模型视图控制器框架, Sail.js 就是这种框架。
全栈框架——这些框架在服务器端和浏览器上用的都是 JavaScript,并且两端可以共享代码。这被称为同构代码。 DerbyJS 是个全栈 MVC 框架。
Koa
Koa 是以 Express 为基础开发的,但它用 ES2015 中的生成器语法来定义中间件。也就是说几乎可以编写异步的中间件。这在某种程度上解决了中间件重度依赖回调的问题。在 Koa 中可以用 yield 退出和重入中间件。
//Koala的中间件顺序
const koa = require('koa');
const app = new koa();
//在中间件函数上使用生成器语法
app.use(function*(next){
const start = new Date;
yield next;//yield运行下一个中间件组件
const ms = new Date - start;
console.log('%s %s - %s',this.method,this.url,ms);
});
app.use(function*(){
this.body = 'Hello Koa';//回到开始yield的位置继续执行
});
app.listen(3000);
使用生成器函数带来的额外好处是只要设定 this.body 就好了。 Express则需要用函数来发送响应: res.send(response)。在 Koa 中间件中, this 就是上下文。每个请求都有对应的上下文,用来封装 Node 的 HTTP request 和 response 对象。在需要访问请求里的东西时,比如 GET 参数或 cookie,可以通过这个请求上下文来访问。响应也是如此,就像上面代码里所展示的,设定 this.body 里的值就可以控制送什么给浏览器。
设置
Koa 项目的设置工作包括安装模块和定义中间件。如果需要更多功能,比如要通过路由 API定义和响应各种 HTTP 请求,则需要安装路由中间件。也就是说典型的工作流程需要事先规划好项目要用到的中间件。
定义路由
koa-router 是一个流行的路由器中间件组件。它也是基于 HTTP 动词的,这点跟 Express 一样,不同之处是它的链式 API。
router
.post('/pages', function*(next) {
// 创建页面
})
.get('/pages/:id', function*(next) {
// 渲染页面
})
.put('pages-update', '/pages/:id', function*(next) {
// 更新页面
});
可以提供额外的参数给路由命名。这可以用来生成 URL,并不是所有 Node Web 框架都支持这一功能。
router.url('pages-update', '99');
REST API
Koa 没有提供实现 RESTful API 所必需的工具,只能借助某种路由处理中间件。
优点
主要优势是它很精简,还有一些非常棒的第三方模块,Koa 的维基百科上有更详细的介绍。因为语法优雅,能根据项目的具体需求量身定制,所以 Koa深受开发人员喜爱。
弱点
Koa 的可配置水平让一些开发人员望而却步。除非有现成的代码共享策略,否则用 Koa 创建太多小项目会导致低下的代码复用率。
Kraken
Kraken 是基于 Express 的,又通过 Paypal 开发的一些定制模块添了些新功能。为程序提供安全层的 Lusca 是其中特别实用的一个模块。虽然 Lusca 可以独立于 Kraken 使用,但 Kraken 还有一个好处是它预定义的项目结构。 Express 和 Koa 程序对项目结构没有任何要求,相较之下,Kraken 在创建新项目上提供了更多帮助。
设置
可以将 Kraken 作为中间件组件添加到 Express 项目中:
const express = require('express');
const kraken = require('kraken-js');
const app = express();
app.use(kraken());
app.listen(3000);
也可以用 Kraken 的 Yeoman 生成器创建一个新项目。 Yeoman 是用来生成新项目的工具,可以用它的生成器生成各种框架的初始项目。
$ npm install -g yo generator-kraken bower grunt-cli
$ yo kraken
定义路由
在 Kraken 中,路由被定义为跟控制器在一起。这跟 Express 把路由定义和路由处理器分开的做法不同, Kraken 采用了 MVC 的方式,由于 ES6 箭头函数的使用,这样更轻便。
module.exports = (router) => {
router.get('/', (req, res) => {
res.render('index');
});
};
路由器可以在 URL 中放置参数:
module.exports = (router) => {
router.get('/people/:id', (req, res) => {
const people = { alex: { name: 'Alex' } };
res.render('people/edit', people[req.param.id]);
});
};
Kraken 的路由 API 是 express-enrouten,并且它会根据文件所在的目录推断路由。比如说,如果有下面这样的目录结构:
controllers
|-user
|-create.js
|-list.js
那么 Kraken 会生成路由 /user/create 和 /user/list。
REST API
Kraken 可以做 REST API,但没有什么特别的支持。 express-enrouten 可以跟解析 JSON 的中间件相结合,所以能实现 REST API。
Kraken 的路由器支持 DELETE、 GET、 POST、 PUT 等 HTTP 动词,在实现 REST 时跟 Express类似。
优点
由于生成器的原因, Kraken 项目从大体上来看都差不多。虽然 Express 项目的目录结构可以随心所欲,但 Kraken 项目一般不会改变文件和目录的位置。
弱点
Kraken 比 Koa 或 Express 难学。一些在 Express 中可以通过编程完成的任务,在 Kraken 中要通过 JSON 配置文件来做,并且有时候很难确定到底要用哪些 JSON 属性才能得到预期结果。