先放一些別人寫的node
我也來湊個熱鬧git
羣裏不少人在問到底該用Koa仍是express,本文會對比2個框架的各類細節,並給出指導意見,但願可以爲你們解惑。es6
koa 是由 Express 原班人馬打造的,致力於成爲一個更小、更富有表現力、更健壯的 Web 框架。使用 koa 編寫 web 應用,經過組合不一樣的 generator,能夠免除重複繁瑣的回調函數嵌套,並極大地提高錯誤處理的效率。koa 不在內核方法中綁定任何中間件,它僅僅提供了一個輕量優雅的函數庫,使得編寫 Web 應用變得駕輕就熟。github
Koa 目前須要 >=0.11.x版本的 node 環境。並須要在執行 node 的時候附帶 --harmony 來引入 generators 。web
express無所謂,目前0.10+都ok,甚至更低版本express
Koa 應用是一個包含一系列中間件 generator 函數的對象。 這些中間件函數基於 request 請求以一個相似於棧的結構組成並依次執行。 Koa 相似於其餘中間件系統(好比 Ruby’s Rack 、Connect 等), 然而 Koa 的核心設計思路是爲中間件層提供高級語法糖封裝,以加強其互用性和健壯性,並使得編寫中間件變得至關有趣。api
Koa 包含了像 content-negotiation(內容協商)、cache freshness(緩存刷新)、proxy support(代理支持)和 redirection(重定向)等經常使用任務方法。 與提供龐大的函數支持不一樣,Koa只包含很小的一部分,由於Koa並不綁定任何中間件。緩存
和 express 基於的中間件Connect,差異並不大,思想都是同樣的,它裏面說的服務器
加強其互用性和健壯性
我還沒玩出太多感想,請你們指點cookie
除了yield next;
外,並沒有其餘
yield要說一下,必須在處理的中間件裏纔會回調
好比
var koa = require('koa'); var app = koa(); //1 x-response-time app.use(function *(next){ var start = new Date; yield next; var ms = new Date - start; this.set('X-Response-Time', ms + 'ms'); }); //2 logger app.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 response app.use(function *(){ this.body = 'Hello World'; }); app.listen(3000);
在程序啓動的時候,1和2是沒有執行的,只有當執行到任意請求,好比3的時候,它纔會調用1和2
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 messages switch (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; } }
兩者實際上沒有啥大差異
將 node 的 request 和 response 對象封裝在一個單獨的對象裏面,其爲編寫 web 應用和 API 提供了不少有用的方法。
這些操做在 HTTP 服務器開發中常用,所以其被添加在上下文這一層,而不是更高層框架中,所以將迫使中間件須要從新實現這些經常使用方法。
context 在每一個 request 請求中被建立,在中間件中做爲接收器(receiver)來引用,或者經過 this 標識符來引用:
app.use(function *(){ this; // is the Context this.request; // is a koa Request this.response; // is a koa Response });
比express裏爽一些,express裏中間件可變參數仍是會比較噁心,並且性能也很差
基本上如出一轍
https://github.com/koajs/koa/blob/master/docs/koa-vs-express.md
Feature | Koa | Express | Connect |
---|---|---|---|
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來比較express並不太合適,能夠說它是介於connect和express中間的框架
koa是一個比express更精簡,使用node新特性的中間件框架,相比以前express就是一個龐大的框架
koa是大勢所趨,我很想用,但我目前沒有選koa,個人考慮
和es6的考慮是同樣的,又愛又恨,先作技術儲備,只要時機ok,堅決果斷的搞起。
目前express由strongloop負責,它的下一步如何發展,還說很差,好比5.0、6.0是否會用koa做爲中間件也很差說
koa代碼不多,能夠很容易讀完
另外值得提得一點是,核心開發者 @dead-horse 是阿里的員工,贊一下國內的開源。
12月份我寫了一個koa-generator,可讓不少習慣express的人遷移過來,見文章https://cnodejs.org/topic/56650091e7cd33da066d6ee7