Koa 是一個精緻小巧的基於 Node.js 的 Web 框架。目前有 1.x
和 2.x
2 個大的版本css
其中 2.x
版本使用了 Node.js v7.6.0 以後支持的 async await
語法糖,提供了更優雅的異步編程模式。web
Koa 有以下特色:express
Koa 經過上面的機制避免了以往 connect 等實現的一些問題,例如要實現一個耗時統計時須要將 startTime 層層傳遞到末尾中間件。Koa 與 express 和 connect 的差異以下:npm
爲了一探 Koa 的全貌,咱們基於 Koa 1.x 的版原本開始學習之旅(主要是爲了學習generator,其餘方面1和2其實原理是同樣的)。後面計劃的教程以下:編程
使用 Koa 搭建一個 Web 應用是極其簡單的。Koa 模塊暴露了一個 Application 的 class 給 Web 開發者,咱們只需實例化這個 Application,並給它注入適當的 請求和響應處理邏輯
. 實際上,整個 Koa 應用的開發模式就是如此簡單。json
下面是步驟:bash
# 初始化 package.json npm init # 安裝 Koa 1.x npm i koa@1 -d
const Koa = require('koa') const app = new Koa() // 實例化一個 Koa 應用 app.listen(3000) // 讓 Koa 啓動內置 server
這樣應用便啓動了,並監聽了本機的 3000 端口。 實際上 http server 也能夠不禁 Koa 來啓動,你能夠導出 Koa 的handler,配合本身的 TSW 或 其餘 Server 來使用:app
const server = http.createServer(app.callback()) server.listen(3000)
上面的代碼目前尚未任何的請求處理邏輯。Koa 是經過給 application 注入中間件函數的方式來注入 業務邏輯。框架
Koa的中間件很像Express的中間件,也是對HTTP請求進行處理的函數,可是必須是一個Generator函數。並且,Koa的中間件是一個級聯式(Cascading)的結構,也就是說,屬因而層層調用,第一個中間件調用第二個中間件,第二個調用第三個,以此類推。上游的中間件必須等到下游的中間件返回結果,纔會繼續執行,這點很像遞歸
從中間件的執行流程能夠看出,第一個被執行的中間件,其也會在最後再次回到該中間件並執行剩下的代碼邏輯。koa
Koa 的中間件依次執行來處理接收的 requests 並響應一個 response。每個中間件都能訪問到 context 對象,這是一個封裝了原生 Node 請求和響應的對象,並提供了許多開發 web 應用和 API 有用的方法。在 Koa 1 裏面,每一箇中間件就是一個 Generator 函數,咱們看這個例子:
const Koa = require('koa') const app = new Koa() // 實例化一個 Koa 應用 // 日誌中間件 const mylogger = function *(next) { yield next // 在 Koa1版本 的Generator中間件函數中,this表示context對象 const rt = this.response.get('X-Respnose-Time') console.log(`${this.method} ${this.url} - ${rt}`) } // x-response-time 中間件 const mytime = function *(next) { const start = Date.now() yield next const ms = Date.now() - start this.set('X-Response-Time', `${ms}ms`) } // 業務邏輯 const mylogic = function *(next) { this.body = 'hello koa 1' } app.use(mylogger) app.use(mytime) app.use(mylogic) app.listen(3000) // 讓 Koa 啓動內置 server
這個例子裏,給 Koa 傳入了 3 箇中間件,每一箇中間件是個 Koa1.x 支持的 Generator 函數。基於 Generator 的支持,咱們能夠在裏面書寫異步代碼,使用 yield 來暫停函數的執行。
基於首箇中間件內 Generator 異步的調用,整個 Koa 中間件至關於被捲入一個棧中,並造成以下的調用順序:
| ↑ | | | | | | ↓ |
在控制檯,咱們能夠看到打印出了一次請求的耗時。
GET / - 1ms
學習 Koa, 其實就是學習 Koa 的 4 個對象:
所以實際上咱們能夠簡單理解爲,編寫中間件代碼時,只須要學習一個對象: context。context 對象會在 Koa 接收到任意一個請求後,執行中間件以前初始化,並傳遞給中間件。它有以下幾個必要的屬性:
更多的屬性和方法文檔,直接參考官網好了
Koa 核心不攜帶任何中間件,路由也是。後面咱們會介紹路由中間件的原理和用法。
Koa 核心不包含任何模板引擎的支持,若是需渲染視圖,咱們須要引入相應的視圖中間件。
Koa 提供了比 express 更精簡的內核,相似 connect 的中間件機制,更 fasion 的異步流程控制方法(1.x 是 generator 2.x 是 async 語法)。兼具精簡、高效、靈活性,是個優秀和值得學習的框架