express和koa的区别

Express VS  Koa

这两个框架师出同门,都是由nodejs大神 TJ Holowaychuk 开发并开源的。TJ Holowaychuk凭借频繁和高质量的提交,对nodejs社区做出了巨大的贡献。

有人怀疑TJ Holowaychuk不是一个人,背后是一个团队,毕竟一个人完成这么多的工作量让人难以相信。

TJ Holowaychuk绝对称得上伟大的程序员,而伟大的程序员从来都是“缺少什么,就创造什么”。当年Bram Moolenaar 在 80 年代末购入他的Amiga计算机时,因为Amiga 上没有他最常用的编辑器vi,于是就开发了vim编辑器。

TJ Holowaychuk觉得需要一个好用的node框架,于是就有了Express和Koa。

Express 和 Koa2 的区别主要有以下几点:

1 架构设计

Express是一个集合式的框架,自身集成了router,static,views,bodyparse等等常用中间件。这样的设计让开发者能非常快速的搭建一个node后端服务,这个服务功能齐全。可以实现接口服务,静态资源服务,页面服务,甚至文件上传也能实现。但是使用Express就必须引入全部的中间件和功能,不管你有没有用到。

Koa2的设计思想就是小而美,轻量,插件化设计。只提供最基础的框架,所有功能都通过中间件引入。Koa将Express集成的中间件进行拆分,开发者按需引入即可使用。比如:

得益于这种设计,用户在选择中间件时有了更多的选项。你可以选择koa提供的中间件(如果koa提供的话),也可以选择社区或第三方开发的中间件,甚至自己写一个都可以。这在Express上是无法想象的。

总结来说,Express是一个功能齐全,开箱即用的集合式框架,比较重。Koa2是一个插件化的轻量框架,功能按需引入。

2 ECMAScript版本

Express是基于ES5开发的,受限制于当时的JavaScript标准,很多功能的实现方式不是很好。比如异步执行只能采用回调函数的方式。

Koa2是基于ES7(ES2016)开发的,原生支持异步函数 async/await,使用Promise作为异步处理的标准,支持箭头函数等ES6新语法。我想着重推荐一下async/await,因为它又一次改变了JavaScript异步编程的方式,可以不关心是不是异步操作,全用同步的方式去写。举个例子来对比一下Promise 和 async/await,用 Promise 和 async/await 实现同样的异步操作:

可以看出,async/await 的写法更简单整洁,也更方便阅读。 Koa2能完美的支持ES6,如果想使用ES6新特性,Koa2比Express更值得选择。

3 中间件执行机制

中间件的执行机制可以说是Koa相较Express最大的改进。有人问TJ Holowaychuk为什么不升级Express而要开发的新的Koa框架? TJ Holowaychuk就提到了中间件机制和Express不同,Express项目难以直接升级使用新的中间件机制,只能开发新的框架。

我们先看一下Express的中间件执行流程:

Express的中间件时线性执行的,每一个中间件处理完后只有两个选择:交给下一个中间件或者返回Response。

只要请求离开了,中间件就无法再次获得这个请求,更不能再对它进行处理。

Koa的中间件机制是洋葱模型,中间件像一层层的洋葱。请求要穿过洋葱,每个中间件也会被穿过两次。

这个洋葱模型相信大家都很熟悉了,它很直观的解释了koa中间件的执行流程。这种洋葱模型机制对解决某些问题帮助很大,比如统计一个请求耗时时间,或者需要回调下一个中间件的处理结果,使用koa处理起来就非常方便,但是使用Express就很难实现。

如果Express也想实现Koa的洋葱模型就比较困难,需要开发者在每一个中间件上都添加回调函数。因此Express项目真的很难直接使用Koa的中间件机制,怪不得TJ Holowaychuk大神也要另起炉灶。

如果你有这样的需求,与其写层层回调还不如直接使用Koa。

4 异常处理

Express的异常处理是有一个error处理中间件完成的,由于Express的中间件时线性流程,所以要处理错误信息就必须把error中间件放到最后。

下面举个栗子说明在Express中如何使用这个错误处理中间件:

使用的规则就是:只要有错误,请调用error中间件。

如果逻辑比较多,恐怕要到处调用 next(err) 了。


最后简单总结下express 和 koa的区别

1. 语法区别

experss 异步使用 回调
koa1 异步使用 generator + yeild
koa2 异步使用 await/async

2. 中间件区别

koa采用洋葱模型,进行顺序执行,出去反向执行,支持context传递数据
express本身无洋葱模型,需要引入插件,不支持context
express的中间件中执行异步函数,执行顺序不会按照洋葱模型,异步的执行结果有可能被放到最后,response之前。
这是由于,其中间件执行机制,递归回调中没有等待中间件中的异步函数执行完毕,就是没有await中间件异步函数

3. 集成度区别

express 内置了很多中间件,集成度高,使用省心,
koa 轻量简洁,容易定制

 

参考链接: https://www.cnblogs.com/mengff/p/12856439.html

 

posted @ 2021-11-17 10:55  进军的蜗牛  阅读(1448)  评论(0编辑  收藏  举报