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 很轻量, 因此很多功能不健全需要开发者有一定的能力去完善它, 例如统一的错误上报及其监控, 集群处理, 单元测试等功能
来源: https://www.thinksaas.cn/group/topic/839575/