koa 2.0 系列:
Introduction
在开始 koa 之前,先回想下一个 Web Framework 应该要做的事。
- 监听请求
- 处理 request 中的 header/body
- 返回 response 中的 header/body
统称 request/response 为 context
,一般处理 context 不会只有一件事,大多数时间,我们需要权限验证,判断用户来源,RateLimit,日志,自定义返回数据 等等,这些事件为一个链状,context 顺序通过这些事件并对其进行加工,这些的事件在 express/koa 中叫 middleware
。
当你看完 代码 时,你会发现和我们设想的一样简单:
1 | lib |
所以 koa 内部主要关注两个要点:
- context(上下文)
- middleware(中间件)
## Why Koa
讲了上述的点后,并没有说明为什么是 koa,而不是 express 或其它。选择 koa 主要是以下几个重要的点:
- Callback hell
- ES 2017
- Middleware U型嵌套
- 轻量化内核
Callback hell
1.0 中,是通过 Generator 来实现了 coroutine-like
,取消了 callback。
Callback 有两大硬伤,一是不可组合,二是异常不可捕获。
ES 2017
当然,选择它的主要原因是还有 支持 ES 的新语法
2.0 中用了 async functions
代替了 1.0 中的 co 的 Generator functions
,使语法更优雅。
middleware U型嵌套
机制
这是 koa 很有特色的一个地方,另花笔墨去写。
轻量化内核
和 express 不同的是,它只做了 Web Framework 应该做的,Router,View 都不再提供,更轻量化。
当然也提供了多样性,可以用更适合的 middleware 来做事情。
## koa 2.0 Roadmap
koa 2.0 目前并没有正式发布,主要是为了等 V8 的 async functions 集成。但并不意味着不能投入使用,相反很多公司都已经应用于生产了。
## koa 2.0 Boilerplate
这是我写的一个 koa2 的最佳实践项目,其中包括:
- 完整的项目结构
- koa-router 集成
- Sequlize & MySQL
- DI Container 支持
- Class 语法
- Babel 配置
- Multiple Environment 支持
重点说明下,为什么和其它的项目结构有所不同,这里采用的是类 rails 的结构,而不是将所有代码都放置在 src 目录下,原因是 node 很快就会支持所有的新语法,编译不再是必须的。