Koa 还是 Express
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
先放一些別人寫的
- http://yemista.com/koa-js-vs-express-js-which-one-better-for-node-js/
- https://www.airpair.com/node.js/posts/nodejs-framework-comparison-express-koa-hapi
- https://cnodejs.org/topic/540335d0cd66f2eb379b21d5
我也來(lái)湊個(gè)熱鬧
群里很多人在問(wèn)到底該用Koa還是express,本文會(huì)對(duì)比2個(gè)框架的各種細(xì)節(jié),并給出指導(dǎo)意見,希望能夠?yàn)榇蠹医饣蟆?/p>
- http://koajs.com/
- http://expressjs.com/
koa
koa 是由 Express 原班人馬打造的,致力于成為一個(gè)更小、更富有表現(xiàn)力、更健壯的 Web 框架。使用 koa 編寫 web 應(yīng)用,通過(guò)組合不同的 generator,可以免除重復(fù)繁瑣的回調(diào)函數(shù)嵌套,并極大地提升錯(cuò)誤處理的效率。koa 不在內(nèi)核方法中綁定任何中間件,它僅僅提供了一個(gè)輕量?jī)?yōu)雅的函數(shù)庫(kù),使得編寫 Web 應(yīng)用變得得心應(yīng)手。
版本要求
Koa 目前需要 >=0.11.x版本的 node 環(huán)境。并需要在執(zhí)行 node 的時(shí)候附帶 --harmony 來(lái)引入 generators 。
express無(wú)所謂,目前0.10+都o(jì)k,甚至更低版本
中間件變化
Koa 應(yīng)用是一個(gè)包含一系列中間件 generator 函數(shù)的對(duì)象。 這些中間件函數(shù)基于 request 請(qǐng)求以一個(gè)類似于棧的結(jié)構(gòu)組成并依次執(zhí)行。 Koa 類似于其他中間件系統(tǒng)(比如 Ruby’s Rack 、Connect 等), 然而 Koa 的核心設(shè)計(jì)思路是為中間件層提供高級(jí)語(yǔ)法糖封裝,以增強(qiáng)其互用性和健壯性,并使得編寫中間件變得相當(dāng)有趣。
Koa 包含了像 content-negotiation(內(nèi)容協(xié)商)、cache freshness(緩存刷新)、proxy support(代理支持)和 redirection(重定向)等常用任務(wù)方法。 與提供龐大的函數(shù)支持不同,Koa只包含很小的一部分,因?yàn)镵oa并不綁定任何中間件。
和 express 基于的中間件Connect,差別并不大,思想都是一樣的,它里面說(shuō)的
增強(qiáng)其互用性和健壯性我還沒(méi)玩出太多感想,請(qǐng)大家指點(diǎn)
除了yield next;外,并無(wú)其他
yield要說(shuō)一下,必須在處理的中間件里才會(huì)回調(diào)
比如
var koa = require('koa'); var app = koa();//1 x-response-timeapp.use(function *(next){var start = new Date;yield next;var ms = new Date - start;this.set('X-Response-Time', ms + 'ms'); });//2 loggerapp.use(function *(next){var start = new Date;yield next;var ms = new Date - start;console.log('%s %s - %s', this.method, this.url, ms); });//3 responseapp.use(function *(){this.body = 'Hello World'; });app.listen(3000);在程序啟動(dòng)的時(shí)候,1和2是沒(méi)有執(zhí)行的,只有當(dāng)執(zhí)行到任意請(qǐng)求,比如3的時(shí)候,它才會(huì)調(diào)用1和2
錯(cuò)誤處理
koa
app.on('error', function(err){log.error('server error', err); });而在新版的express里
server.on('error', onError);/*** Event listener for HTTP server "error" event.*/function onError(error) {if (error.syscall !== 'listen') {throw error;}var bind = typeof port === 'string'? 'Pipe ' + port: 'Port ' + port;// handle specific listen errors with friendly messagesswitch (error.code) {case 'EACCES':console.error(bind + ' requires elevated privileges');process.exit(1);break;case 'EADDRINUSE':console.error(bind + ' is already in use');process.exit(1);break;default:throw error;} }二者實(shí)際上沒(méi)有啥大差別
Koa Context
將 node 的 request 和 response 對(duì)象封裝在一個(gè)單獨(dú)的對(duì)象里面,其為編寫 web 應(yīng)用和 API 提供了很多有用的方法。
這些操作在 HTTP 服務(wù)器開發(fā)中經(jīng)常使用,因此其被添加在上下文這一層,而不是更高層框架中,因此將迫使中間件需要重新實(shí)現(xiàn)這些常用方法。
context 在每個(gè) request 請(qǐng)求中被創(chuàng)建,在中間件中作為接收器(receiver)來(lái)引用,或者通過(guò) this 標(biāo)識(shí)符來(lái)引用:
app.use(function *(){this; // is the Contextthis.request; // is a koa Requestthis.response; // is a koa Response });比express里爽一些,express里中間件可變參數(shù)還是會(huì)比較惡心,而且性能也不好
對(duì)比一些api
- req
- res
基本上一模一樣
二者比較總結(jié)
https://github.com/koajs/koa/blob/master/docs/koa-vs-express.md
| Middleware Kernel | ? | ? | ? |
| Routing | ? | ? | ? |
| Templating | ? | ? | ? |
| Sending Files | ? | ? | ? |
| JSONP | ? | ? | ? |
Does Koa replace Express?
It’s more like Connect, but a lot of the Express goodies were moved to the middleware level in Koa to help form a stronger foundation. This makes middleware more enjoyable and less error-prone to write, for the entire stack, not just the end application code.
Typically many middleware would re-implement similar features, or even worse incorrectly implement them, when features like signed cookie secrets among others are typically application-specific, not middleware specific.
拿koa來(lái)比較express并不太合適,可以說(shuō)它是介于connect和express中間的框架
- 與connect類似都是調(diào)用棧思想,但修改了中間件模式,使用generator
- 把express里的一些好的東西加進(jìn)去,但剔除了路由,視圖渲染等特性
總結(jié)
koa是一個(gè)比express更精簡(jiǎn),使用node新特性的中間件框架,相比之前express就是一個(gè)龐大的框架
- 如果你喜歡diy,很潮,可以考慮koa,它有足夠的擴(kuò)展和中間件,而且自己寫很簡(jiǎn)單
- 如果你想簡(jiǎn)單點(diǎn),找一個(gè)框架啥都有,那么先express
koa是大勢(shì)所趨,我很想用,但我目前沒(méi)有選koa,我的考慮
- node 0.11+我目前沒(méi)有搞定node-inspector,所以我啥時(shí)候搞定,啥時(shí)候遷移
- 團(tuán)隊(duì)成本問(wèn)題,如果他們連express都不會(huì),上來(lái)就koa,學(xué)習(xí)曲線太陡,不合適
- 目前基于express的快讀開發(fā)框架需要一段時(shí)間遷移到koa
和es6的考慮是一樣的,又愛又恨,先做技術(shù)儲(chǔ)備,只要時(shí)機(jī)ok,毫不猶豫的搞起。
目前express由strongloop負(fù)責(zé),它的下一步如何發(fā)展,還說(shuō)不好,比如5.0、6.0是否會(huì)用koa作為中間件也不好說(shuō)
koa代碼很少,可以很容易讀完
https://github.com/koajs/koa
另外值得提得一點(diǎn)是,核心開發(fā)者 @dead-horse 是阿里的員工,贊一下國(guó)內(nèi)的開源。
12月份我寫了一個(gè)koa-generator,可以讓很多習(xí)慣express的人遷移過(guò)來(lái),見文章https://cnodejs.org/topic/56650091e7cd33da066d6ee7
轉(zhuǎn)載于:https://my.oschina.net/dawd/blog/744332
總結(jié)
以上是生活随笔為你收集整理的Koa 还是 Express的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 社保卡里的钱怎么转账
- 下一篇: DSP 投放的基本流程和算法