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對錯誤進行了統一的處理
這些方法在官網都有很詳細的介紹。
此源碼解析並無真正的一字一行的去解析,去理解,只講解了面。