致敬原作者
Koa和Express都是NodeJS的主流應用開發框架。
Express是一個完整的nodejs應用框架。Koa是由Express團隊開發的,但是它有不同的關注點。Koa致力於核心中間件功能。nodejs中間件是訪問請求對象(req)和響應對象(res)的例程。這些例程在路由處理程序之前被調用,因此它們位於客戶端與生成響應的路由邏輯的“中間”。nodejs應用程序可以將中間件例程“鏈接”到自定義請求/響應管道中。管道可以根據請求和響應進行操作,包括頭和主體。Express和Koa都包含中間件,但實現方法卻截然不同。
核心Koa模塊只是中間件內核。而Express包含一個完整的應用程序框架,具有路由和模板等功能。Koa確實有這些功能的選項,但它們是單獨的模塊。因此,Koa的模塊化程度更高;您只需包含所需的模塊即可。核心KOA模塊只有大約2千行代碼,因此,如果您只需要核心請求應答上下文對象,則Koa占用空間非常小。相比較而言,Express較為龐大,內置了一整套中間件功能,好處是對於大部分應用場合你可以省掉自己選擇和組合模塊的時間。
Koa對Express進行了擴展,並充分利用了ES7新的語法。Koa的Context對象是對Express核心請求和應答對象的擴展,另外利用async/await來消除回調(callback)陷阱。
回調的語法類似如下:
|
1
2
3
4
5
6
7
8
9
|
function
myFunction(params, callback){
//make async call here
asyncCall(params,
function
(res) {
callback(res);
})
}
myFunction(myParams,
function
(data){
//do something with 'data' here
})
|
異步語法async/await類似如下:
|
1
2
3
4
5
6
7
8
9
10
11
|
async myFunction(){
try
{
let res = await asyncCall();
return
res;
}
catch
(err){
console.log(
"Error: "
+ err);
}
}
let result = await myFunction();
|
回調陷阱(大量嵌套的回調函數)問題這里略過,寫過大型JS應用的,應該都深有體會,下面的async/await語法除了執行順序更加清楚之外,異常處理也更容易。對異步問題的處理方式是Koa和Express兩者一個顯著區別。
關於性能,這兩個框架相差無幾,Koa略好,這里略過具體的測試用例了,基本上都能達到幾千req/s。
最后簡單總結下,如何選型:
-
如果是新項目,運行環境對ES7語法沒有限制,對性能比較看重,團隊有較高的定制化需求和技能,那么優先選擇Koa;
-
如果是Express的老項目,那么建議繼續使用Express,沒必要只是為了用新技術而來遷移,Koa和Express也不那么兼容;
-
如果你不想自己選擇和搭建各種模塊組件並有可能需要處理兼容問題,而喜歡一體的、快速集成開發,那么選擇Express,Express是一套成熟的應用開發框架,而不僅僅提供核心模塊
