同當前煊赫一時的Express同樣,它是一款更年輕的web應用框架javascript
Koa,是 Express 原班人馬基於 ES6 新特性從新開發的框架,主要基於co 中間件,框架自身不包含任何中間件,不少功能須要藉助第三方中間件解決,可是因爲其基於 ES6 generator 特性的異步流程控制,解決了 "callback hell" 和麻煩的錯誤處理問題。css
異步流程控制java
Express 採用 callback 來處理異步,Koa v1 採用 generator,Koa v2 採用 async/await。
下面分別對 js 當中 callback、promise、generator、async/await 這四種異步流程控制進行了對比,
generator 和 async/await 使用同步的寫法來處理異步,明顯好於 callback 和 promise,async/await 在語義化上又要比 generator 更強。node
錯誤處理
Express 使用 callback 捕獲異常,對於深層次的異常捕獲不了,
Koa 使用 try catch,能更好地解決異常捕獲。git
詳細訪問:
Node.js 框架對比之 Express VS Koaes6
一張圖更好的理解Express & koa 的設計思想web
Koa的思想express
Express的思想,就是把請求當成流,沿着中間件一層一層的過,每一層均可以對請求進行處理,最終處理完成的,返回給客戶端,npm
而Koa 的中間件以相似堆棧的方式流動,容許執行下游操做,而後過濾並操縱上游的響應。
它的執行流程是經過es6中的generator來實現的。generator函數能夠像打斷點同樣從函數某個地方跳出,以後還能夠再回來繼續執行。經過這個例子來理解:json
function* gen() { console.log('begin'); //3.執行到yield會帶着後面的數據切出,就是執行這個函數, yield anotherfunc; //6.下次回來時候從這裏開始執行 console.log('end!'); } var anotherfunc(){ console.log('this is another function!'); } //1.執行gen函數,不會當即執行它內部的代碼,而是返回一個迭代器, var g=gen(); //2.經過迭代器的next()方法,啓動迭代器,這裏就會進入gen()函數執行, var another=g.next(); //'begin!' //4.another是一個對象,其中value成員就是返回的anotherfunc函數 another.value(); //'this is another function!' //5.再次調用next()方法,這裏能夠傳參數,能夠將參數切入(不理解能夠先去搞清generator函數) g.next(); //'end!';
這實際上是koa1的實現方式,在koa2中會採用es6的async/await,async/await至關因而generator和yield的語法糖,
詳細瞭解請訪問:
深刻探析koa之中間件流程控制篇
安裝Koa:
Koa須要支持ES2015和async function的node v7.6.0或更高版本。
1.你能夠選擇安裝最新版的node環境,(卸載重裝)
2.利用nvm(node的版本管理)安裝指定版本的node環境,nvm不要用命令行安裝,須要實際安裝
$ nvm install 7
初始化package.json
npm init -y
而且配置script選項爲:
"dev": "node koa2.js"
安裝依賴
npm i -S koa
新建一個koa2.js,加入官方給的model
const Koa = require('koa'); const app = new Koa(); // x-response-time app.use(async (ctx, next) => { const start = Date.now(); await next(); const ms = (Date.now() - start) * 1000; ctx.set('X-Response-Time', `${ms}ms`); }); // logger app.use(async (ctx, next) => { const start = Date.now(); await next(); const ms = (Date.now() - start) * 1000; console.log(`${ctx.method} ${ctx.url} - ${ms}`); }); // response app.use(async ctx => { ctx.body = 'Hello World'; }); app.listen(3000);
運行
npm run dev
打開瀏覽器,訪問localhost:3000,親切的hello world映入眼簾。
express有應用生成器,那koa固然也有啊,
仍是安裝:
必定要全局安裝(koa1.2和koa2都己經支持)
npm install koa-generator -g
koa2 生成一個test項目,切到test目錄並下載依賴:
koa2 test & cd test $ npm install
運行
npm start
訪問 http://localhost:3000
express和koa生成項目時視圖模板默認是用jade,若是要切換爲ejs,在生成項目時,添加一個參數,
koa2 -e test
奉上koa2生成器的參數:
-h, --help 幫助
-V, --version 版本號-e, --ejs 添加ejs模板引擎支持(默認是jade) --hbs 添加hbs模板引擎支持(默認是hbs)-H, --hogan 添加hogan.js支持-c, --css <engine> 添加css樣式 支持 less sass styus css(默認是css) --git 添加 .gitignore-f, --force force on non-empty directory