koa2的源码比较简单,整个框架只要能够很好的理解其中间件基本就能了解其运行和设计的原理。
我建议读koa的源码最好从使用的写法开始梳理,一步一步深入其原理。
一段最简单的koa源码如下:
const Koa = require('koa');
const app = new Koa();
app.use(async ctx => {
ctx.body = 'Hello World';
});
app.listen(3000);根据此段代码可以看出,koa是一个对象,从案例上看此对象上有use、listen方法。让我们来看看它是如何工作的。
listen方法如何工作
来到 lib/application.js 文件,先看listen方法。
代码很简单,创建一个http服务,然后监听3000端口,这样就创建了一个简单的http服务。
this.callback() 返回一个 有req和res参数的函数。至此listen方法就已经明了。
listen(...args) {
const server = http.createServer((req, res) => {
const ctx = this.createContext(req, res);
return this.handleRequest(ctx, fn);
});
return server.listen(...args);
}跟node.js创建一个http服务是一致的。
koa中间件如何工作
中间件事koa.js的核心概念和核心组成部分,其强大,可拓展也是在于此。
use方法很简单,向koa对象的 middleware中push函数。接下来看看中间件函数如何工作。
app.use -> app.middleware -> koa-compose -> http.createServer所有的中间件函数都会缓存到app.middlewares数组中,创建http.createServer时默认拿到第一个中间件函数去进行相应的操作,koa-compose是处理中间件的核心。
根据源代码可以看出 koa-compose 会首先执行一次 dispatch(0) 也就是默认返回第一个 app.use传入的函数 使用Promise函数封装返回,其中第一个参数是我们常用的ctx,第二个参数就是next参数,
next 每次执行之后都会等于下一个中间件函数,如果下一个中间件函数不为真则返回一个成功的Promise。因此我们每次调用next()就是在执行下一个中间件函数。
错误处理
koa对错误进行了统一的处理
其他文件说明
- lib/context.js 主要是对 context/ctx的封装,拓展了很多方法
- lib/request.js 对ctx.req 的封装,拓展了很多方法
- lib/response.js 对ctx.res 的封装,拓展了很多方法
这些方法在官网都有很详细的介绍。
此源码解析并没有真正的一字一行的去解析,去理解,只讲解了面。
总结:
- koa是一个很轻量级的node.js基础框架,性能优,入门简单
- 核心的设计模式是对中间件的设计,框架只提供了基础的功能,比例cookie,router等都是由中间件去完成,可扩展性非常强
- 广大贡献者提供了N多的中间件,是一个很健全的基础框架
- 中间间使用灵活,由于其使用机制,中间件会有顺序的问题,使用者需注意,有些中间件需要提前引入,有些中间件需要后面引入
- 开发模式灵活,没有任何的代码性和规范性的约束,因此可以做为任何node.js框架的底层库,同时也由于此原因如果涉及到多人协作,开发者需要注意到规范性的约束
- 适合个人开发者,官网开发等,不太适合大型项目的多人协作项目,如果有很好的上层封装,或者二次开发就更能适应企业级的node.js开发,比如egg.js,thinkjs
- 由于koa很轻量,因此很多功能不健全需要开发者有一定的能力去完善它,例如统一的错误上报及其监控,集群处理,单元测试等功能