这篇文章是我正在进行写作的《新时期的Node.js入门》的一部分
Connect,Express与Koa
为了更好地理解后面的内容,首先需要梳理一下Node中Web框架的发展历程
Connect
在connect官方网站提供的定义是,
Connect is a middleware layer for Node.js
开发者可以认为connect是一个Node中间件的脚手架。
Connect的源码结构十分简单,只有一个文件,去掉注释后的代码不超过两百行。
我们之所以首先提到connect,是因为connect首先在Node服务器编程中引入了middleware的概念,这种概念在当时(2010年)无疑是超前的,中间件概念的引入,将web开发变成了一个个独立的模块,使得社区的开发者们可以专注在中间件模块的开发上,
为后面express的诞生与繁荣打下了坚实的基础。
此外,connect还提出了一些关于中间件使用的规范,例如使用use方法加载中间件并且通过next方法调用中间件等
Express的诞生
Express框架是在Connect的基础上扩展而来的,它继承了connect的大部分思想,
Express的发展分为两个阶段,express3.x与express4.x
在3.x中,express依赖与connect的源码,并且内置了不少中间件,这种做法的缺点是如果内置的中间件更新了,那么开发者就不得不更新整个express
4.x中,express摆脱了对connect的依赖,并且摒弃了除了静态文件模块之外的所有中间件,只包含核心的路由处理(在express中,路由没有被当做中间件)以及其他的代码。
在过去的几年中,express取得了巨大的成功
MEAN(Mongo+Express+Angular+Node)架构成为了不少网站的开发首选,至今依旧非常流行。
Koa
但是Express依旧存在不少的缺点,对于中间件之间的异步流程控制没有提供良好的支持。
随着ES2015标准的落地,express的原班开发人法使用ES2015中的新特性重新打造了新的Web框架—Koa。
Koa的实现与connect更加相似,内部没有提供任何中间件,仅仅作为中间件的调用的脚手架。
Koa的发展同样存在两个阶段Koa1.x 和Koa2,两者之间的区别在于Koa2使用了ES2017中的新特性,这些特性已经在v7.6.0之后的Node版本中提供原生支持。
KOA入门
KOA 1.x 与KOA2
在web开发中,尽管http请求的处理是异步进行的,但我们还是希望能够顺序执行某些操作。
例如在收到http请求时,我们首先先将请求信息写入日志或者数据库,再返回对应的结果,这两个操作往往都是异步进行的,如果我们要顺序完成这两个任务,通常会使用嵌套回调的方式,或者借助一些三方模块进行异步流程控制
为了解决这个问题,Koa诞生了。
在KOA 1.x的版本中,由于当时node还没有完全实现对async/await的支持,因此使用了generator函数来作为异步处理的主要方式,此外,为了实现generator的自动执行,还使用了上一章介绍的co模块作为底层的处理逻辑—它们都是出自同一作者之手。
下面是koa1.x代码的例子
var koa = require('koa');
var app = koa();
// logger
app.use(function *(next){
var start = new