Express和koa各有啥優缺點?
阿新 • • 發佈:2019-01-30
1. Koa 雖然同它哥 Express 說的一樣,是 Web Framework。不過從架構功能設計和架構設計上看,它更像它舅舅(原諒我親戚關係懵了)── Connect。更多是一箇中間件框架,其提供的是一個架子,而幾乎所有的功能都需要由第三方中介軟體完成。
2. Express 更為貼近 Web Framework 這一概念,比如自帶 Router、路由規則等(在沒有剝離bodyParser之前更為貼切);相比之下 Koa 則更為寬鬆,光是 Router 就有 20+ 個,自由選擇嘛(Home · koajs/koa Wiki · GitHub),更為靈活。 @死馬 (Koa 的 maintainer 之一)也釋出了一個推薦的常用中介軟體合集包 koa-middlewares(http://npmjs.org/package/koa-middlewares)。
3. Express 和 Koa 最明顯的差別就是 Handler 的處理方法,一個是普通的回撥函式,一個是利用生成器函式(Generator Function)來作為響應器。往裡頭兒說就是 Express 是在同一執行緒上完成當前程序的所有 HTTP 請求,而 Koa 利用 co 作為底層執行框架,利用 Generator 的特性,實現“協程響應”(並不能將 Generator 等價於協程,在 V8 的郵件列表中對 Generator 的定義基本是 `coroutine-like`),然而 co 這個庫對 Generator 的使用方法並非當初 Generator 的設計初衷。詳細可以看這裡: Koa, co and coroutine
4. 還是要感謝 TJ 創造了 co 這個大殺器吧,讓我們基本完全忘記了什麼是回撥函式或者 callbacks hell。雖然實現方法略微取巧,但是就大大加速了開發速度這一點而言,已經足以讓我們跪舔了。
回正題吧==
Express:
優點:歷史更久,文件更完整,資料更多,深入人心
缺點:不能忍的 callback
Koa:
優點:No Callback! No Callback! No Callback! 重要的事情說三遍!
缺點:Connect/Express 的中介軟體基本不能重用,基本要重寫;依然需要更多人的支援和學習
======分割線======
目前已經大面積使用 Koa 作為 Web 開發框架的產品:(需補充請評論)
=========================
更新關於 Koa 2.0 的看法
首先安利一發: 給 JavaScript 初心者的 ES2015 實戰
Koa 2.0 與 Koa 1.x 版本的最大區別就是使用了 ES7 中 Async/Await 的特性,代替了 co 的 Generator Function,好處是擺脫了 co 的“曖昧”實現方法,改而使用原生的 Coroutine-like(maybe) 語法。缺點是與從 connect/express 遷移到 Koa 1.x 一樣,很弱的向前相容,需要用一個 wrapper 來繼續使用 1.x 的中介軟體:gyson/koa-convert · GitHub。不過好在,Koa 團隊表示在 ES7 標準正式落地之前,不會切換到 2.0 版本上去,所以暫時可以放心使用 1.x 版本。
2. Express 更為貼近 Web Framework 這一概念,比如自帶 Router、路由規則等(在沒有剝離bodyParser之前更為貼切);相比之下 Koa 則更為寬鬆,光是 Router 就有 20+ 個,自由選擇嘛(Home · koajs/koa Wiki · GitHub),更為靈活。 @死馬 (Koa 的 maintainer 之一)也釋出了一個推薦的常用中介軟體合集包 koa-middlewares(http://npmjs.org/package/koa-middlewares)。
3. Express 和 Koa 最明顯的差別就是 Handler 的處理方法,一個是普通的回撥函式,一個是利用生成器函式(Generator Function)來作為響應器。往裡頭兒說就是 Express 是在同一執行緒上完成當前程序的所有 HTTP 請求,而 Koa 利用 co 作為底層執行框架,利用 Generator 的特性,實現“協程響應”(並不能將 Generator 等價於協程,在 V8 的郵件列表中對 Generator 的定義基本是 `coroutine-like`),然而 co 這個庫對 Generator 的使用方法並非當初 Generator 的設計初衷。詳細可以看這裡:
4. 還是要感謝 TJ 創造了 co 這個大殺器吧,讓我們基本完全忘記了什麼是回撥函式或者 callbacks hell。雖然實現方法略微取巧,但是就大大加速了開發速度這一點而言,已經足以讓我們跪舔了。
回正題吧==
Express:
優點:歷史更久,文件更完整,資料更多,深入人心
缺點:不能忍的 callback
Koa:
優點:No Callback! No Callback! No Callback! 重要的事情說三遍!
缺點:Connect/Express 的中介軟體基本不能重用,基本要重寫;依然需要更多人的支援和學習
======分割線======
目前已經大面積使用 Koa 作為 Web 開發框架的產品:(需補充請評論)
=========================
更新關於 Koa 2.0 的看法
首先安利一發:
Koa 2.0 與 Koa 1.x 版本的最大區別就是使用了 ES7 中 Async/Await 的特性,代替了 co 的 Generator Function,好處是擺脫了 co 的“曖昧”實現方法,改而使用原生的 Coroutine-like(maybe) 語法。缺點是與從 connect/express 遷移到 Koa 1.x 一樣,很弱的向前相容,需要用一個 wrapper 來繼續使用 1.x 的中介軟體:gyson/koa-convert · GitHub。不過好在,Koa 團隊表示在 ES7 標準正式落地之前,不會切換到 2.0 版本上去,所以暫時可以放心使用 1.x 版本。