express和koa的区别

2021年11月24日 阅读数:4
这篇文章主要向大家介绍express和koa的区别,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

Express VS  Koa

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

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

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

TJ Holowaychuk以为须要一个好用的node框架,因而就有了Express和Koa。express

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

1 架构设计

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

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

得益于这种设计,用户在选择中间件时有了更多的选项。你能够选择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 实现一样的异步操做:koa

能够看出,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