Koa原始碼分析

2021-09-11 13:11:08 字數 3017 閱讀 3924

先看看這個極簡的啟動**:

const koa = require('koa');

// response

ctx.body = 'hello koa';

});

我們在koa原始碼資料夾下建立index.js檔案, 將上面的**寫入,並將require('koa')換成require('.')

const koa = require('.')

debugger

ctx.body = 'hello koa';

});複製**

然後進入目錄執行node --inspect-brk index.js

在chrome瀏覽器開啟除錯chrome://inspect

1.引入koa

require 會依照這個順序去查詢需要的檔案

module._extensions=複製**

通過讀取package.json中的main欄位得到完整路徑

查詢到路徑之後通過 fs.readfilesync載入模組

讀取檔案後開始編譯,首先將讀取的**script,進行組裝,

即頭部新增(function (exports, require, module, __filename, __dirname) );'

nativemodule.wrap = function(script) ;

'(function (exports, require, module, __filename, __dirname) );'

];複製**

這就是為什麼每個模組沒有定義exports, require, module, __filename, __dirname變數,卻能使用的原因

constructor()

首先new koa()的時候就是new的這個物件, 最關鍵的是建立了context,request,response物件

constructor

() 複製**

use()

通過該方法引入中介軟體,中介軟體可以是乙個普通的函式, 可以是乙個generator, 可以是async函式,如果是generator那麼koa會幫你轉成基於promise的函式。根據use使用的先後順序, middleware陣列中會儲存所有的中介軟體。

use(fn) 

this.middleware.push(fn);

return this;

}複製**

listen()

listen函式表面上看是用於監聽某個埠,實際上包裹了真正的nodejs提供的http server, createserver函式接受乙個處理請求的函式,由callback()返回

listen(...args) 

複製**

callback()

callback

() ;

return handlerequest;

}複製**

createcontext()

這個函式與其說是建立context物件,不如說是將koa的各個內部物件連線在一起。並設定cookies和accepts.

// req, res 是node的原生請求響應物件,是所有資訊的**.

// request,response是koa提供的方便我們開發使用的請求響應物件.

createcontext(req, res) );

// 更常用的從ip中讀取請求方的ip位址, ips是?

request.ip = request.ips[0] || req.socket.remoteaddress || '';

// 使用accepts設定請求能接受的內容型別

context.accept = request.accept = accepts(req);

// ?

context.state = {};

return context;

}複製**

respond()

當我們完成處理需要返回時我們設定this.body = '***'然後函式返回,不需要我們手動呼叫res.end(),因為koa已經幫我們封裝好了.

/**

* response helper.

*/function respond(ctx)

if ('head' === ctx.method)

return res.end();

} // 如果沒有設定body,只設定了status,則用狀態碼或message設定body.

if (null == body)

return res.end(body);

}

// koa 支援buffer, string, stream型別的資料

if (buffer.isbuffer(body)) return res.end(body);

if ('string' === typeof body) return res.end(body);

if (body instanceof stream) return body.pipe(res);

// body: json 處理普通json型別返回.

body = json.stringify(body);

if (!res.headerssent)

res.end(body);

}複製**

context是整個請求的上下文,其最特殊的地方其實是整合response和request,讓你在應用的任何地方通過context獲得應用相關的任何資訊

響應體相關的方法屬性

Koa原始碼分析

上篇文章寫了如何閱讀koa的原始碼,粗略的過了一下koa的原始碼,但是作為乙個沒有得出乙個具體的結論,中介軟體的執行原理也不清楚,這裡我們再仔細的過一遍koa的原始碼.首先還是先過一遍例子 const koa require koa ctx.body hello world 複製 起乙個web服務,...

koa 原始碼分析

koa的用法,這裡就不在列舉了。我覺得koa主要功能主要是下面幾個方面 1 提供了中介軟體機制 2 封裝了request response,context物件 3 使用了yield,提供了便利的流程控制,使非同步程式設計更優雅 4 便捷的異常處理,使用try catch就可以捕獲程式中的異常,不需要...

Koa 原始碼分析

閱讀原始碼可以很好地提高自身水平,從 會用 到 掌握原理 的過程,也是自身從前端菜鳥到中高階高階的過程,在不少面試過程中,也會問到你有沒有閱讀過原始碼等問題。該場 chat 將會為大家分享一下看似很複雜,其實超級簡單的 node.js koa 框架。主要會分享以下內容 koa 封裝原生 http 模...