基于 Node 的下一代 Web 開發(fā)框架--koa

由 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的工作望艺,集合開源的力量做了一個 中文文檔 有更詳細的API說明。

在這里要感謝 一米 對網站建設的大力貢獻肌访,還要感謝 郭宇 對翻譯工作的大力貢獻找默,此中文文檔遵循MIT協(xié)議,轉載著名出處即可吼驶。


愛生活惩激,愛技術。
愿結識各路小伙伴蟹演。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末风钻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子酒请,更是在濱河造成了極大的恐慌骡技,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件羞反,死亡現(xiàn)場離奇詭異布朦,居然都是意外死亡囤萤,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門喝滞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來阁将,“玉大人,你說我怎么就攤上這事右遭∽鲋眩” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵窘哈,是天一觀的道長吹榴。 經常有香客問我,道長滚婉,這世上最難降的妖魔是什么图筹? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮让腹,結果婚禮上远剩,老公的妹妹穿的比我還像新娘。我一直安慰自己骇窍,他們只是感情好瓜晤,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著腹纳,像睡著了一般痢掠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嘲恍,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天足画,我揣著相機與錄音,去河邊找鬼佃牛。 笑死淹辞,一個胖子當著我的面吹牛,可吹牛的內容都是我干的吁脱。 我是一名探鬼主播桑涎,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼兼贡!你這毒婦竟也來了?” 一聲冷哼從身側響起娃胆,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤遍希,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后里烦,有當地人在樹林里發(fā)現(xiàn)了一具尸體凿蒜,經...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡禁谦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了废封。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片州泊。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖漂洋,靈堂內的尸體忽然破棺而出遥皂,到底是詐尸還是另有隱情,我是刑警寧澤刽漂,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布演训,位于F島的核電站,受9級特大地震影響贝咙,放射性物質發(fā)生泄漏样悟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一庭猩、第九天 我趴在偏房一處隱蔽的房頂上張望窟她。 院中可真熱鬧,春花似錦蔼水、人聲如沸震糖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽试伙。三九已至,卻和暖如春于样,著一層夾襖步出監(jiān)牢的瞬間疏叨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工穿剖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蚤蔓,地道東北人。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓糊余,卻偏偏與公主長得像秀又,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子贬芥,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內容