Koa2.x 源码阅读顺序
您可以在我的github上clone一下源码。地址戳这(https://github.com/yaoqifa/LearningKoa2.x)
记得给个star
首先看koa目录下的Readme, 了解koa的基本用法,再花几分钟时间通读下History.md对koa的历史有个基本了解。
下面进入正题。
入口是 koa/lib 下的application.js这个文件。这个文件里我做了详细的注释。先看module.export,导出的就是一个Class Application,
Application继承了Emitter, 使用时就是new 它,得到一个koa实例,它能做到的事: 传入中间件,监听端口生成一个服务器实例,然后能拿到http请求,请求逐层的经过middleware数组,经过后的结果
交给handleRespose处理响应,response 里就是具体返回内容。
阅读Application的过程就是:找到module.export, 看到constructor,进入listen方法,发现
const server = http.createServer(this.callback());
这行代码相当于
http.createServer(function (req, res) {
res.send()
})
所以跟进callback方法查看做了什么,
callback() {
const fn = compose(this.middleware);
if (!this.listeners('error').length) this.on('error', this.onerror);
const handleRequest = (req, res) => {
const ctx = this.createContext(req, res);
return this.handleRequest(ctx, fn);
};
return handleRequest;
}
首先应用了compose方法,该方法的作用就是执行中间件的函数数组里每一项都是函数,递归执行每个函数,前一个函数的结果作为后一个函数的输出。
compose代码很巧妙,一个尾递归,将所有中间件串起来,具体可查看koa-compose。
继续… 上面的错误处理代码可以不看,重点是handleRequest方法,正是callback返回的东西,所以该方法相当于http.createServer里那个回调,handleRequest 里根据createContext方法创建一个ctx,ctx就是执行上下文,通过它能设置和修改req、res、cookies等。下面分析createContext方法的源码。
createContext(req, res) {
const context = Object.create(this.context);
con