zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Flask目录结构
    RHSA-2019:1880-低危: curl 安全和BUG修复更新 及 RHSA-2019:1884-中危: libssh2 安全更新
    ELK+Logback进行业务日志分析查看
    Maven编译过程中出现的问题
    Zabbix监控服务器磁盘I/O
    创建readonly只读用户脚本
    Zabbix监控多个JVM进程
    redis命令
    docker配置Nginx
    docker基本命令
  • 原文地址:https://www.cnblogs.com/yalong/p/15566133.html
Copyright © 2011-2022 走看看