由 Express 原班人馬打造的 koa汇竭,致力于成為一個更小坏匪、更健壯淘这、更富有表現(xiàn)力的 Web 框架剥扣。使用 koa 編寫 web 應用巩剖,通過組合不同的 generator,可以免除重復繁瑣的回調函數嵌套钠怯,并極大地提升常用錯誤處理效率佳魔。Koa 不在內核方法中綁定任何中間件,它僅僅提供了一個輕量優(yōu)雅的函數庫晦炊,使得編寫 Web 應用變得得心應手鞠鲜。
安裝koa
koa 依賴支持 generator 的 Node 環(huán)境,也就是說断国,node的版本要在 0.11.9
或者更高贤姆,否則將無法執(zhí)行。
用npm:
$ npm install koa
或者稳衬,選擇安裝在全局:
$ npm install -g koa
Example
這是一個koa的簡單例子:
var koa = require('koa');
var app = koa();
// 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);
});
// response
app.use(function *(){
this.body = 'Hello World';
});
app.listen(3000);
與普通的 function 不同霞捡,generator functions 以 function* 聲明。以這種關鍵詞聲明的函數支持 yield
薄疚。在后面會講到 yield
的用法和意義碧信。
執(zhí)行koa
執(zhí)行koa時需要在 —-harmony
模式下運行,為了方便可以將 node
設置為默認啟動 harmony
模式的別名:
alias node='node --harmony'
這樣在執(zhí)行相關js的時候就可以直接使用了街夭。
Cascading
這是一個比較抽象的概念砰碴。Koa 中間件以一種非常傳統(tǒng)的方式級聯(lián)起來,也就是這里所謂的Cascading板丽。
在以往的 Node 開發(fā)中呈枉,頻繁使用回調不太便于展示復雜的代碼邏輯,在 Koa 中檐什,我們可以寫出真正具有表現(xiàn)力的中間件碴卧。與 Connect 實現(xiàn)中間件的方法相對比,Koa 的做法不是簡單的將控制權依次移交給一個又一個的中間件直到程序結束乃正,Koa 執(zhí)行代碼的方式有點像回形針,用戶請求通過中間件婶博,遇到 yield next
關鍵字時瓮具,會被傳遞到下一個符合請求的路由(downstream),在 yield next
捕獲不到下一個中間件時凡人,逆序返回繼續(xù)執(zhí)行代碼(upstream)名党。
下邊這個例子展現(xiàn)了使用這一特殊方法書寫的 Hello World 范例:一開始,用戶的請求通過 x-response-time 中間件和 logging 中間件挠轴,這兩個中間件記錄了一些請求細節(jié)传睹,然后「穿過」 response 中間件一次,最終結束請求岸晦,返回 「Hello World」欧啤。
當程序運行到 yield next
時睛藻,代碼流會暫停執(zhí)行這個中間件的剩余代碼,轉而切換到下一個被定義的中間件執(zhí)行代碼邢隧,這樣切換控制權的方式店印,被稱為 downstream,當沒有下一個中間件執(zhí)行 downstream 的時候倒慧,代碼將會逆序執(zhí)行按摘。
var koa = require('koa');
var app = koa();
// x-response-time
app.use(function *(next){
// (1) 進入路由
var start = new Date;
yield next;
// (5) 再次進入 x-response-time 中間件,記錄2次通過此中間件「穿越」的時間
var ms = new Date - start;
this.set('X-Response-Time', ms + 'ms');
// (6) 返回 this.body
});
// logger
app.use(function *(next){
// (2) 進入 logger 中間件
var start = new Date;
yield next;
// (4) 再次進入 logger 中間件纫谅,記錄2次通過此中間件「穿越」的時間
var ms = new Date - start;
console.log('%s %s - %s', this.method, this.url, ms);
});
// response
app.use(function *(){
// (3) 進入 response 中間件炫贤,沒有捕獲到下一個符合條件的中間件,傳遞到 upstream
this.body = 'Hello World';
});
app.listen(3000);
在上方的范例代碼中付秕,中間件以此被執(zhí)行的順序已經在注釋中標記出來照激。你也可以自己嘗試運行一下這個范例,并打印記錄下各個環(huán)節(jié)的輸出與耗時盹牧。
.middleware1 {
// (1) do some stuff
.middleware2 {
// (2) do some other stuff
.middleware3 {
// (3) NO next yield !
// this.body = 'hello world'
}
// (4) do some other stuff later
}
// (5) do some stuff lastest and return
}
上方的偽代碼中標注了中間件的執(zhí)行順序俩垃,看起來是不是有點像 ruby 執(zhí)行代碼塊(block)時 yield 的表現(xiàn)了?也許這能幫助你更好的理解 koa 運作的方式汰寓。
中間件(Middleware)
實際上口柳,這些只是初步理解了koa基礎,koa有很多第三方開發(fā)的中間件有滑,這些中間件的熟練運用才是關鍵跃闹,github有很多這方面的庫,每個都有詳細的例子解釋毛好。以下是常用的一些:
- koa-router
- trie-router
- route
- basic-auth
- etag
- compose
- static
- static-cache
- session
- compress
- csrf
- logger
- mount
- send
- error
小結
這些天確實做了寫有關koa的工作望艺,集合開源的力量做了一個 中文文檔
有更詳細的API說明。
在這里要感謝 一米
對網站建設的大力貢獻肌访,還要感謝 郭宇
對翻譯工作的大力貢獻找默,此中文文檔遵循MIT協(xié)議,轉載著名出處即可吼驶。
愛生活惩激,愛技術。
愿結識各路小伙伴蟹演。