koa是Express的下一代基於Node.js的web框架,目前有1.x和2.0兩個版本。
歷史
1. Express
Express是第一代最流行的web框架,它對Node.js的http進行了封裝,用起來如下:
'use strict' var express=require('express'); var app=express(); app.get('/',function(req,res){ res.send('Hello world!'); }); app.listen(3000,function(){ console.log('Example app listening on port 3000!'); }); //可以在http://127.0.0.1:3000訪問
雖然Express的API很簡單,但是它是基於ES5的語法,要實現異步代碼,只有一個方法:回調。如果異步嵌套層次過多,代碼寫起來就非常難看:
雖然可以用async這樣的庫來組織異步代碼,但是用回調寫異步實在是太痛苦了!
2. koa 1.0
隨着新版Node.js開始支持ES6,Express的團隊又基於ES6的generator重新編寫了下一代web框架koa。和Express相比,koa 1.0使用generator實現異步,代碼看起來像同步的:
var koa=require('koa'); var app=koa(); app.use('/test',function*(){ yield doReadFile1(); var data=yield doReadFile2(); this.body = data; }); app.listen(3000); //可以在http://127.0.0.1:3000訪問
用generator實現異步比回調簡單了不少,但是generator的本意並不是異步。Promise才是為異步設計的,但是Promise的寫法……想想就復雜。為了簡化異步代碼,ES7(目前是草案,還沒有發布)引入了新的關鍵字async
和await
,可以輕松地把一個function變為異步模式:
async function () { var data = await fs.read('/file1'); }
這是JavaScript未來標准的異步代碼,非常簡潔,並且易於使用。
3. koa2
koa團隊並沒有止步於koa 1.0,他們非常超前地基於ES7開發了koa2,和koa 1相比,koa2完全使用Promise並配合async
來實現異步。
koa2的代碼看上去像這樣:
app.use(async (ctx, next) => { await next(); var data = await doReadFile(); ctx.response.type = 'text/plain'; ctx.response.body = data; });
出於兼容性考慮,目前koa2仍支持generator的寫法,但下一個版本將會去掉。
koa2是以后的趨勢