Koa2原始碼學習

2021-08-28 14:53:58 字數 3618 閱讀 7964

koa – 基於 node.js 平台的下一代 web 開發框架

const koa = require('koa');

// do some thing

});

以上**構建了乙個簡單的伺服器,你可以在瀏覽器輸入 localhost:8080 來訪問

下面我們通過建立koa伺服器,且傳送一次http請求來了解原始碼

在koa例項化前,先介紹四個物件

...const context = require('./context');

const request = require('./request');

const response = require('./response');

...// 例項化前,主要是引入koa三個物件

context物件:上下文物件,封裝了response、request及http原生response、request物件的方法和屬性

request物件: koa request物件,是對http.incomingmessage的抽象

response物件:koa response物件,是對http.serverresponse的抽象

context

koa上下文物件,大部分操作都是通過ctx(context簡寫)完成的

context物件包含兩部分:

// lib/context.js

// context物件自身的方法及屬性

const proto = module.exports = ,

...}// 委託的request和response物件的方法

delegate(proto, 'response')

.method('attachment')

...delegate(proto, 'request')

.method('acceptslanguages')

...

delegate方法實現

request

對http.incomingmessage的抽象,提供了很多方法和屬性,使操作更加方便

// lib/request.js

module.exports = ,

set header(val) ,

...}

response

對http.serverresponse的抽象,提供了很多方法和屬性,使操作更加方便

// lib/response.js

module.exports = ,

get header() = this;

return typeof res.getheaders === 'function'

? res.getheaders()

: res._headers || {}; // node < 7.7

},...

}

...

// 應用**

const koa = require('koa');

...

...

constructor()

...// 主要是賦值,這裡的middleware就是儲存中介軟體的陣列

值得注意的是這裡僅僅是賦值,並沒有任何呼叫http服務的**

object.create語法參考

// 應用**
...

listen(...args)

...// listen方法就是是http的語法糖

這裡值得注意的是

callback方法

在listen方法中,主要是this.callback方法,其他都是http基本用法

...

callback() ;

return handlerequest;

}...

callback重要的兩個部分:

以下分別來介紹這兩個部分

compose方法

在koa中,中介軟體非常重要,絕大部分多功能都是由中介軟體來實現的,中介軟體重要的幾個特點:

讓我們看一下koa-compose是如何實現的

...

// koa-compose/index.js

return function (context, next) catch (err)

}}...

以上**中,最重要的dispatch函式,通過遞迴dispatch,來實現中介軟體的連續且按順序呼叫

以兩個中介軟體為例子

// do some thing1

next()

// do some thing3

}); // do some thing2

});

執行第乙個中介軟體**:do some thing1

呼叫了next方法

執行第二個中介軟體**:do some thing2,後續無中介軟體,即返回

next返回後,再次執行第乙個中介軟體 do some thing3

執行完畢後返回

這就是koa中介軟體的特性之一,洋蔥圈的原理

值得注意的是:

handlerequest方法

這裡呼叫了兩個方法createcontext和handlerequest

... const handlerequest = (req, res) => ;

...createcontext

createcontext方法主要是建立context物件及賦值

... createcontext(req, res) ;

return context;

}...

這裡值得注意的:

因為this.callback是在每次"request"請求時呼叫的,每個request請求都會呼叫createcontext方法,即每個請求的context都是不一樣的,可以放心操作

handlerequest

該方法主要是呼叫中介軟體及處理響應

... handlerequest(ctx, fnmiddleware)

...

// 應用**

// do some thing1

next()

// do some thing3

});

...

use(fn)

debug('use %s', fn._name || fn.name || '-');

this.middleware.push(fn); // 將中介軟體存入陣列中

return this;

} ...

下面按照"建立乙個簡單伺服器及響應一次請求"來闡述**執行順序

執行listen函式

執行callback函式

伺服器收到請求,觸發"request"事件

執行handlerequest函式

koa2原始碼解析

koa版本2.4.1 以如下示例 進行說明 const koa require koa 1.執行建構函式 2.註冊中介軟體 ctx.body hello world 3.啟動指定埠的http服務 複製 1.建構函式constructor 複製 2.註冊中介軟體use fn 複製 3.啟動指定埠的ht...

koa2 原始碼解讀

自從在簡歷上寫了使用過nodejs的koa框架起,我被面試官問起node和koa的次數呈指數 為了防止一問三不知的情況再次發生決心去閱讀原始碼。首先我們看下不使用koa和使用的區別 呼叫listen 函式,在listen函式中我們可以看到,開啟了乙個http服務並傳入了callback 函式 lis...

koa2原始碼解讀與總結

koa2的原始碼比較簡單,整個框架只要能夠很好的理解其中介軟體基本就能了解其執行和設計的原理。我建議讀koa的原始碼最好從使用的寫法開始梳理,一步一步深入其原理。一段最簡單的koa原始碼如下 const koa require koa ctx.body hello world 根據此段 可以看出,k...