前言
Koa 是一个粗劣玲珑的基于 Node.js 的 Web 框架。目前有 1.x
和 2.x
2 个大的版本
其中 2.x
版本应用了 Node.js v7.6.0 之后反对的 async await
语法糖,提供了更优雅的异步编程模式。
Koa 有如下特点:
- 内核精简,不内置中间件. 玲珑但富裕表现力。
- 相似栈的形式运行中间件,Koa 调用上游,而后堆栈开展再将管制再流回上游。简略实用
- 实用 async await 或 generator 防止了 callback hell
- 优雅的异样捕捉
Koa 通过下面的机制防止了以往 connect 等实现的一些问题,例如要实现一个耗时统计时须要将 startTime 层层传递到开端中间件。Koa 与 express 和 connect 的差异如下:
为了一探 Koa 的全貌,咱们基于 Koa 1.x 的版本来开始学习之旅 (次要是为了学习 generator,其余方面 1 和 2 其实原理是一样的)。前面打算的教程如下:
- 开始。装置和启动
- 罕用中间件
- 错误处理和最佳实际
- 开发并部署一个 todo-list 利用
- 降级为 Koa2
- 初探 Koa 源码
装置
应用 Koa 搭建一个 Web 利用是极其简略的。Koa 模块裸露了一个 Application 的 class 给 Web 开发者,咱们只需实例化这个 Application,并给它注入适当的 申请和响应解决逻辑
. 实际上,整个 Koa 利用的开发模式就是如此简略。
上面是步骤:
- 进入咱们的我的项目目录,装置 Koa
# 初始化 package.json
npm init
# 装置 Koa 1.x
npm i koa@1 -d
- 在咱们的我的项目目录创立一个 index.js 文件,用于编写 Web 站点的次要逻辑
const Koa = require('koa')
const app = new Koa() // 实例化一个 Koa 利用
app.listen(3000) // 让 Koa 启动内置 server
这样利用便启动了,并监听了本机的 3000 端口。实际上 http server 也能够不禁 Koa 来启动,你能够导出 Koa 的 handler,配合本人的 TSW 或 其余 Server 来应用:
const server = http.createServer(app.callback())
server.listen(3000)
下面的代码目前还没有任何的申请解决逻辑。Koa 是通过给 application 注入中间件函数的形式来注入 业务逻辑。
中间件
Koa 的中间件很像 Express 的中间件,也是对 HTTP 申请进行解决的函数,然而必须是一个 Generator 函数。而且,Koa 的中间件是一个级联式(Cascading)的构造,也就是说,属于是层层调用,第一个中间件调用第二个中间件,第二个调用第三个,以此类推。上游的中间件必须等到上游的中间件返回后果,才会继续执行,这点很像递归
从中间件的执行流程能够看出,第一个被执行的中间件,其也会在最初再次回到该中间件并执行剩下的代码逻辑。
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 个对象:
- Application 类型的实例属性和办法(次要用作 Web 利用的设置和启动)
- context 上下文对象, 它是包裹了 Node.js 的 http request 和 response 对象,同时又提供了 Koa 的一些办法和属性供开发者应用
- Koa request 对象。这个便是 context.request(Koa 1 外面是 this.request),是 Koa 为了开发不便提供的一些跟 http 申请相干的办法
- Koa response 对象。这个便是 context.response(Koa 1 外面是 this.response),是 Koa 为了开发不便提供的跟 http 响应无关的办法
因而实际上咱们能够简略了解为,编写中间件代码时,只须要学习一个对象:context。context 对象会在 Koa 接管到任意一个申请后,执行中间件之前初始化,并传递给中间件。它有如下几个必要的属性:
- request:指向 Request 对象
- response:指向 Response 对象
- req:指向 Node 的 request 对象
- res:指向 Node 的 response 对象
- app:指向 App 对象
- state:用于在中间件传递信息。
更多的属性和办法文档,间接参考官网好了
路由
Koa 外围不携带任何中间件,路由也是。前面咱们会介绍路由中间件的原理和用法。
视图渲染
Koa 外围不蕴含任何模板引擎的反对,如果需渲染视图,咱们须要引入相应的视图中间件。
总结
Koa 提供了比 express 更精简的内核,相似 connect 的中间件机制,更 fasion 的异步流程管制办法(1.x 是 generator 2.x 是 async 语法)。兼具精简、高效、灵活性,是个优良和值得学习的框架