koa2的源码比较简单,整个框架只要可以很好的理解其中间件基本就能了解其运行和设计的原理。node
我建议读koa的源码最好从使用的写法开始梳理,一步一步深刻其原理。设计模式
const Koa = require('koa');
const app = new Koa();
app.use(async ctx => {
ctx.body = 'Hello World';
});
app.listen(3000);复制代码
根据此段代码能够看出,koa是一个对象,从案例上看此对象上有use、listen方法。让咱们来看看它是如何工做的。数组
来到 lib/application.js
文件,先看listen方法。缓存
代码很简单,建立一个http服务,而后监听3000端口,这样就建立了一个简单的http服务。bash
this.callback() 返回一个 有req和res参数的函数。至此listen方法就已经明了。cookie
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服务是一致的。app
中间件事koa.js的核心概念和核心组成部分,其强大,可拓展也是在于此。框架
use方法很简单,向koa对象的 middleware中push函数。接下来看看中间件函数如何工做。koa
app.use -> app.middleware -> koa-compose -> http.createServer复制代码
全部的中间件函数都会缓存到app.middlewares数组中,建立http.createServer时默认拿到第一个中间件函数去进行相应的操做,koa-compose是处理中间件的核心。async
根据源代码能够看出 koa-compose 会首先执行一次 dispatch(0) 也就是默认返回第一个 app.use传入的函数 使用Promise函数封装返回,其中第一个参数是咱们经常使用的ctx,第二个参数就是next参数,
next 每次执行以后都会等于下一个中间件函数,若是下一个中间件函数不为真则返回一个成功的Promise。所以咱们每次调用next()就是在执行下一个中间件函数。
koa对错误进行了统一的处理
这些方法在官网都有很详细的介绍。
此源码解析并无真正的一字一行的去解析,去理解,只讲解了面。