Express VS Koa
這兩個框架師出同門,都是由nodejs大神 TJ Holowaychuk 開發並開源的。TJ Holowaychuk憑借頻繁和高質量的提交,對nodejs社區做出了巨大的貢獻。
有人懷疑TJ Holowaychuk不是一個人,背后是一個團隊,畢竟一個人完成這么多的工作量讓人難以相信。
TJ Holowaychuk絕對稱得上偉大的程序員,而偉大的程序員從來都是“缺少什么,就創造什么”。當年Bram Moolenaar 在 80 年代末購入他的Amiga計算機時,因為Amiga 上沒有他最常用的編輯器vi,於是就開發了vim編輯器。
TJ Holowaychuk覺得需要一個好用的node框架,於是就有了Express和Koa。
Express 和 Koa2 的區別主要有以下幾點:
1 架構設計
Express是一個集合式的框架,自身集成了router,static,views,bodyparse等等常用中間件。這樣的設計讓開發者能非常快速的搭建一個node后端服務,這個服務功能齊全。可以實現接口服務,靜態資源服務,頁面服務,甚至文件上傳也能實現。但是使用Express就必須引入全部的中間件和功能,不管你有沒有用到。
Koa2的設計思想就是小而美,輕量,插件化設計。只提供最基礎的框架,所有功能都通過中間件引入。Koa將Express集成的中間件進行拆分,開發者按需引入即可使用。比如:
得益於這種設計,用戶在選擇中間件時有了更多的選項。你可以選擇koa提供的中間件(如果koa提供的話),也可以選擇社區或第三方開發的中間件,甚至自己寫一個都可以。這在Express上是無法想象的。
總結來說,Express是一個功能齊全,開箱即用的集合式框架,比較重。Koa2是一個插件化的輕量框架,功能按需引入。
2 ECMAScript版本
Express是基於ES5開發的,受限制於當時的JavaScript標准,很多功能的實現方式不是很好。比如異步執行只能采用回調函數的方式。
Koa2是基於ES7(ES2016)開發的,原生支持異步函數 async/await,使用Promise作為異步處理的標准,支持箭頭函數等ES6新語法。我想着重推薦一下async/await,因為它又一次改變了JavaScript異步編程的方式,可以不關心是不是異步操作,全用同步的方式去寫。舉個例子來對比一下Promise 和 async/await,用 Promise 和 async/await 實現同樣的異步操作:
可以看出,async/await 的寫法更簡單整潔,也更方便閱讀。 Koa2能完美的支持ES6,如果想使用ES6新特性,Koa2比Express更值得選擇。
3 中間件執行機制
中間件的執行機制可以說是Koa相較Express最大的改進。有人問TJ Holowaychuk為什么不升級Express而要開發的新的Koa框架? TJ Holowaychuk就提到了中間件機制和Express不同,Express項目難以直接升級使用新的中間件機制,只能開發新的框架。
我們先看一下Express的中間件執行流程:
Express的中間件時線性執行的,每一個中間件處理完后只有兩個選擇:交給下一個中間件或者返回Response。
只要請求離開了,中間件就無法再次獲得這個請求,更不能再對它進行處理。
Koa的中間件機制是洋蔥模型,中間件像一層層的洋蔥。請求要穿過洋蔥,每個中間件也會被穿過兩次。
這個洋蔥模型相信大家都很熟悉了,它很直觀的解釋了koa中間件的執行流程。這種洋蔥模型機制對解決某些問題幫助很大,比如統計一個請求耗時時間,或者需要回調下一個中間件的處理結果,使用koa處理起來就非常方便,但是使用Express就很難實現。
如果Express也想實現Koa的洋蔥模型就比較困難,需要開發者在每一個中間件上都添加回調函數。因此Express項目真的很難直接使用Koa的中間件機制,怪不得TJ Holowaychuk大神也要另起爐灶。
如果你有這樣的需求,與其寫層層回調還不如直接使用Koa。
4 異常處理
Express的異常處理是有一個error處理中間件完成的,由於Express的中間件時線性流程,所以要處理錯誤信息就必須把error中間件放到最后。
下面舉個栗子說明在Express中如何使用這個錯誤處理中間件:
使用的規則就是:只要有錯誤,請調用error中間件。
如果邏輯比較多,恐怕要到處調用 next(err) 了。
最后簡單總結下express 和 koa的區別
1. 語法區別
experss 異步使用 回調
koa1 異步使用 generator + yeild
koa2 異步使用 await/async
2. 中間件區別
koa采用洋蔥模型,進行順序執行,出去反向執行,支持context傳遞數據
express本身無洋蔥模型,需要引入插件,不支持context
express的中間件中執行異步函數,執行順序不會按照洋蔥模型,異步的執行結果有可能被放到最后,response之前。
這是由於,其中間件執行機制,遞歸回調中沒有等待中間件中的異步函數執行完畢,就是沒有await中間件異步函數
3. 集成度區別
express 內置了很多中間件,集成度高,使用省心,
koa 輕量簡潔,容易定制
參考鏈接: https://www.cnblogs.com/mengff/p/12856439.html