koa2源碼解讀與總結

koa2的源碼比較簡單,整個框架只要可以很好的理解其中間件基本就能瞭解其運行和設計的原理。node

我建議讀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服務。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中間件如何工做

中間件事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對錯誤進行了統一的處理




其餘文件說明

  • 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很輕量,所以不少功能不健全須要開發者有必定的能力去完善它,例如統一的錯誤上報及其監控,集羣處理,單元測試等功能
相關文章
相關標籤/搜索