koa : Express出品的下一代基於Node.js的web框架

https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/001434501579966ab03decb0dd246e1a6799dd653a15e1b000javascript

 

koa是Express的下一代基於Node.js的web框架,目前有1.x和2.0兩個版本。php

歷史

1. Express

Express是第一代最流行的web框架,它對Node.js的http進行了封裝,用起來以下:java

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!'); }); 

雖然Express的API很簡單,可是它是基於ES5的語法,要實現異步代碼,只有一個方法:回調。若是異步嵌套層次過多,代碼寫起來就很是難看:web

app.get('/test', function (req, res) { fs.readFile('/file1', function (err, data) { if (err) { res.status(500).send('read file1 error'); } fs.readFile('/file2', function (err, data) { if (err) { res.status(500).send('read file2 error'); } res.type('text/plain'); res.send(data); }); }); }); 

雖然能夠用async這樣的庫來組織異步代碼,可是用回調寫異步實在是太痛苦了!express

2. koa 1.0

隨着新版Node.js開始支持ES6,Express的團隊又基於ES6的generator從新編寫了下一代web框架koa。和Express相比,koa 1.0使用generator實現異步,代碼看起來像同步的:app

var koa = require('koa'); var app = koa(); app.use('/test', function *() { yield doReadFile1(); var data = yield doReadFile2(); this.body = data; }); app.listen(3000); 

用generator實現異步比回調簡單了很多,可是generator的本意並非異步。Promise纔是爲異步設計的,可是Promise的寫法……想一想就複雜。爲了簡化異步代碼,ES7(目前是草案,尚未發佈)引入了新的關鍵字asyncawait,能夠輕鬆地把一個function變爲異步模式:框架

async function () { var data = await fs.read('/file1'); } 

這是JavaScript將來標準的異步代碼,很是簡潔,而且易於使用。koa

3. koa2

koa團隊並無止步於koa 1.0,他們很是超前地基於ES7開發了koa2,和koa 1相比,koa2徹底使用Promise並配合async來實現異步。異步

koa2的代碼看上去像這樣:async

app.use(async (ctx, next) => { await next(); var data = await doReadFile(); ctx.response.type = 'text/plain'; ctx.response.body = data; }); 

出於兼容性考慮,目前koa2仍支持generator的寫法,但下一個版本將會去掉。

相關文章
相關標籤/搜索