Koa还是那个Koa,但是Nodejs已经不再是那个Nodejs

30,220 阅读3分钟

曾经

曾几何时,在Nodejs 8以前的年代,我们被JS的回调机制虐得死去活来,想说爱并没有那么容易。而Koa的出现,尤其是co模块,让我们趋之若鹜。精简的代码风格,高效的性能,以及可以使用JS的新语法。都是广大JSer的向往。正如Koa介绍的那样【Expressive middleware for node.js using ES2017 async functions】

现在

随着Nodejs 10的到来,我们再也不需要使用【--harmony】,而Koa的一大优势也就不再是优势了。

性能?

在V8 6.0+版本的加持下,Express的性能也开始和Koa拉齐。下面是测试代码:

// version 2.11.0
const Koa = require('koa');
const app = new Koa();

app.use(ctx => {
  ctx.body = 'Hello Koa';
});

app.listen(3000);
// version 4.17.1
const express = require('express');
const app = express();

app.use((req, res) => {
  res.end('hello express');
})

app.listen(3000);

参看下面数据(MacOS10.12.6,Nodejs v10.17.0):

框架 请求数 并发数 QPS每秒请求数 TPR平均时间
Koa 5000 100 5500 - 6400 14-18ms
Koa 5000 200 6500 - 7700 26-35ms
express 5000 100 5300 - 6100 16-20ms
express 5000 200 5700 - 7600 24-32ms

由于我的电脑比较垃圾,最多只支持200并发症,如果多了ab就卡死了。以上数据是经过多次使用ab压缩取得的平均数据。

    ab -n 5000 -c 200 http://localhost:3000/

而Koa在面向未来的语法兼容上,由于Nodejs的发展,已经和其他框架没有任何区别。

曾经我们为了追求那一点点极致性能而选择Koa,尤其是高并发下,如果是1000w的并发,一个请求快那么十几毫秒,那么久可以节约出几万秒的总处理时间,可以多处理几十万的请求,但是,现在已经大可不必了。

JS语言新特性?

曾经我们可以为了体验更新的JS语法挑战Koa,为了解决回调地狱挑战Koa,被Koa缺乏官方支持的中间件的生态下磨砺前行。也为大家增添了不少乐趣。痛苦并快乐着。但是现在Nodejs本身已经支持超过99%的新语法。

极简框架?

这是一个伪命题,曾经在IBM期间,我与Nodejs核心团队成员(TSC)共事,有幸和他讨论过koa和express的问题,他问我:”你用Nodejs写Web服务会不需要Router吗?会不需要BodyParse吗?会不需要Cookie解析吗?不,不会。那你用一个极简的框架,然后还要把他们安装回来弄得和express一样。那他极简解决了什么问题?“,而企业级应用一般是不在乎那十几毫秒的性能的。

以后

Koa是否还是我们的第一选择呢?在我这里,他一直都不是最优选择。我是Express的忠实用户,其实也主要得益于早年接触Express就是先从接触它的维护团队开始的。而且我的业务场景大多都是企业级应用为主,稳定性,成熟是第一要素。

但是Koa带给我很多快乐是express给不了的。新的视野和乐趣。因为Koa缺乏很多中间件的支持,因此大部分中间件都要自己去写。这期间个人得到了非常大的成长。但是并不是所有团队都能Hold的住。我是亲眼目睹一些团队被Koa拖慢了脚步,甚至最后还有翻船的。而Egg在这方面确实解决了很多技术实力比较薄弱,又想尝试Nodejs技术栈的技术团队的大问题。