koa2原始碼解讀與總結

zane1發表於2019-03-03

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方法。

koa2原始碼解讀與總結

程式碼很簡單,建立一個http服務,然後監聽3000埠,這樣就建立了一個簡單的http服務。

koa2原始碼解讀與總結

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的核心概念和核心組成部分,其強大,可擴充也是在於此。

koa2原始碼解讀與總結

use方法很簡單,向koa物件的 middleware中push函式。接下來看看中介軟體函式如何工作。

app.use -> app.middleware -> koa-compose -> http.createServer複製程式碼

所有的中介軟體函式都會快取到app.middlewares陣列中,建立http.createServer時預設拿到第一個中介軟體函式去進行相應的操作,koa-compose是處理中介軟體的核心。

koa2原始碼解讀與總結

根據原始碼可以看出 koa-compose 會首先執行一次 dispatch(0) 也就是預設返回第一個 app.use傳入的函式 使用Promise函式封裝返回,其中第一個引數是我們常用的ctx,第二個引數就是next引數,

next 每次執行之後都會等於下一個中介軟體函式,如果下一個中介軟體函式不為真則返回一個成功的Promise。因此我們每次呼叫next()就是在執行下一個中介軟體函式。

錯誤處理

koa對錯誤進行了統一的處理

koa2原始碼解讀與總結

koa2原始碼解讀與總結

koa2原始碼解讀與總結

其他檔案說明

  • 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很輕量,因此很多功能不健全需要開發者有一定的能力去完善它,例如統一的錯誤上報及其監控,叢集處理,單元測試等功能

相關文章