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 语法)。兼具精简、高效、灵活性,是个优秀和值得学习的框架