Koa vs Express
鉴于已选定 Koa 框架,故对 Express 未做深入学习,只是大致的了解了后作出的对比总结
相同点
- 本是同根生,相煎何太急
- 构建 web 应用的 node 框架
- 某些语法也无太大区别,如创建 http 服务 app.listen()
不同点
- 概述:
- Express: 框架内容更丰富,有更大的社区,历史更悠久,文档更丰富,用户群更大,支持 jade 等前端模板语言
- Koa: 更小、更富有表现力、更健壮,还未完全成熟、稳定,中间件的使用和编写相对更容易
- 重点:Koa 支持 es6 语法
- 理念:
- Koa 在内核方法中不绑定任何中间件,不提供路由功能,不提供某些工具,如: sending file
- Express otherwise
- 编程方式:
- Koa 摒弃了‘被人诟病’的回调,采用 generator 的方式
- Context:Koa 对 request 和 response 进行了封装,使用方式也相应改变
- Koa: this.body = ‘hello world’
- Express: res.send(‘Hello world’)
- 错误处理:
- Koa: 有默认的错误处理方式
- Express: 没有统一的错误处理
下面是官网对 Koa 和 Express 做出的对比
选项 | Koa | Express |
---|---|---|
Middleware Kernel | ✓ | ✓ |
Routing | ✓ | |
Templating | ✓ | |
Sending Files | ✓ | |
JSONP | ✓ |
尽管如此,Koa 却有丰富的中间件,比如 koa-routing
, koa-jsonp
能实现需要的功能
个人感受
- Koa 提供了更优于 Express 的错误处理
- Koa 对 request 和 response 的封装,号称提高了体验,但个人感觉,体验这个东西,仁者见仁
- Koa 让程序员摆脱”回调函数地狱”,但是作为前端程序员回调应该是必修课,并且虽然出现了 es6,但在现在的工作中回调依然是主调
- 尽管如此,Koa 依然表现出丰富和强大,
Koa1 vs Koa2
Koa2 目前还处于 alpha 版本,需要 node version 7.6.0 以上的支持,否则需要使用 babel 进行转译
- 中间件的使用上
- Koa1: 依赖 co 并采用 generator 函数,在函数内使用 yield 语句
- Koa2: 增加了箭头函数,移除了 co 依赖,使用 Promise, 因此可以结合 async, await 使用
- 中间件的支持上
- Koa1: 明显可使用的中间件更多
- Koa2: 中间件不如 Koa1 丰富
- 具体中间件列表可以看这里
- context 对象的获取上
- Koa1: this 对象,this.req, this.res
- Koa2: cxt 参数,cxt.req, cxt.res
下面是约4个月前,网上有人做的 Koa1, Koa2, Express 压力测试对比数据(点击查看github 项目)
可以大体看出,Koa2 在压测性能方面比起 Koa1 有一定的优势
个人结论:
- Koa2 使用的 Promise 编程方式,似乎比 Koa1 更简明扼要,但是依然,这是个仁者见仁、智者见智的问题
- 目前很多的中间件能很好的 Koa1,但是对 Koa2 的支持不够好
- 就长远目标来看,Koa2 应该是会发展并逐步代替 Koa1 的,要不开发 Koa2 做什么?
- 但 Koa2 目前尚未稳定,不确定现在使用的 Koa2 将来会不会迎来巨变
- 而相应的,对 Koa1 的中间件而言,官方提供了
koa-convert
将 Koa1 的中间件转换为适用于 Koa2 的中间件,在一定程度上会减少将来可能面临的 从 Koa1 到 Koa2 的工作