koa2已發佈了一段時間,能夠考慮入手,參見Node.js最新Web技術棧(2016年4月)node
本文主要是koa 2的文檔解讀和runkoa介紹,讓你們對koa 2有一個更簡單直接的理解git
Koa requires node v4.0.0 or higher for (partial) ES2015 support.es6
部分特性須要ES2015,你們能夠本身比對一下es6在node不一樣版本里的支持特性github
http://kangax.github.io/compat-table/es6/express
const Koa = require('koa'); const app = new Koa(); // 此處開始堆疊各類中間件 //... app.use(ctx => { ctx.body = 'Hello Koa'; }); app.listen(3000);
注意註釋部分,此處開始堆疊各類中間件npm
Koa 是一個 middleware framework, 它提供了 3 種不一樣類型的中間件寫法promise
中間件和express的中間件相似,是有順序的,注意,大部分人都坑死在順序上babel
下面以寫一個logger中間件爲例,一一闡明app
node sdk就支持的,就是最多見的koa
app.js
const Koa = require('koa'); const app = new Koa(); app.use((ctx, next) => { const start = new Date(); return next().then(() => { const ms = new Date() - start; console.log(`${ctx.method} ${ctx.url} - ${ms}ms`); }); }); // response app.use(ctx => { ctx.body = 'Hello Koa in app.js'; }); app.listen(3000);
async/await是異步流程控制更好的解決方案,不少潮人都已經玩起來了,目前node sdk不支持,因此須要babel來轉換一下
app-async.js
const Koa = require('koa'); const app = new Koa(); app.use(async (ctx, next) => { const start = new Date(); await next(); const ms = new Date() - start; console.log(`${ctx.method} ${ctx.url} - ${ms}ms`); }); // response app.use(ctx => { ctx.body = 'Hello Koa in app-async.js'; }); app.listen(3000);
Generator是node 4(嚴格是0.12)開始支持的es6特性裏的很是重要的一個,用generator和promise實現流程控制,讓co充當執行器這一個角色,也是個不錯的解決方案
千萬別把generator叫成生成器,咱們通常習慣把scaffold叫成生成器
app-generator.js
const Koa = require('koa'); const app = new Koa(); const co = require('co'); app.use(co.wrap(function *(ctx, next) { const start = new Date(); yield next(); const ms = new Date() - start; console.log(`${ctx.method} ${ctx.url} - ${ms}ms`); })); // response app.use(ctx => { ctx.body = 'Hello Koa in app-generator.js'; }); app.listen(3000);
啓動執行
npm i -g runkoa runkoa app.js runkoa app-async.js runkoa app-generator.js
測試發起 http 請求
$ curl http://127.0.0.1:3000 Hello Koa in app.js
Old signature middleware (v1.x) support will be removed in v3
實際是koa核心包含了一個叫koa-convert的模塊,它裏面warning說,以generator做爲中間件的寫法將在koa@3裏不支持
可是用co或koa-convert轉過的仍是能夠的,本文的3種寫法都是長期支持的
這樣寫不行。。。。
// Koa will convert app.use(function *(next) { const start = new Date(); yield next; const ms = new Date() - start; console.log(`${this.method} ${this.url} - ${ms}ms`); });
這樣寫是能夠的
const convert = require('koa-convert'); app.use(convert(function *(next) { const start = new Date(); yield next; const ms = new Date() - start; console.log(`${this.method} ${this.url} - ${ms}ms`); }));
我本人比較討厭寫babel,對於node sdk不支持的特性持觀望態度,好比async/await這樣的神器是能夠用的,其餘的是不必定必定要上的,那就觀望好了
若是在koa 2裏用到async/await就須要babel支持了
但是,我仍是不想用,就幾行代碼能搞定的事兒,我不想看到babel出如今個人代碼裏,因而就有了前面用到的runkoa,它的原理也是這樣的,不過看起來更clean一些
Node.js 4.x和5.x支持的es特性仍是有很大差別的,若是不用到,還好,萬一用到就只能babel去轉換,還有就是async支持,必需要stage-3,那麼也仍是須要babel。
Node.js sdk遲遲不更新很討厭,babel更新太快也很討厭
可是,不管從性能,仍是流程控制上,koa 2和它的後宮(中間件)都是很是好的解決方案