背景介绍:
koa和express都是nodejs用来搭建服务器的框架,express较早出现,koa被称为node下一代的http框架,两者由一个团队设计产生,tj作为核心人物,使用两个框架中的任意一个都可以灵活简洁的搭建一个服务器。目前tj本人主要投入于koa的研发,express已经交给团队去维护。
框架区别:
1. 源码方面:
首先koa的源码设计本身更加优秀,koa本身主要是ES6及以上的代码写成,而express主要以ES5代码为主,相比于ES5的var和其他形式,ES6本身在语言层面就有着优势。
其次koa设计比起express代码量更小,express相比之下体系工具更加完善,拥有各种强大的功能。而koa的各项功能主要依靠第三方库,但是依靠外库功能也比较完善。(multer/bodyparser/morgan)
koa在处理中间件的时候,依靠其dispatch函数,对中间件stack进行调度,而express使用next函数对中间件进行调度,dispatch会返回一个Promise,可以对异步函数进行管理,而express则采用的直接调用的方式,不利于对异步函数进行管理,只是在同步函数的管理中保持一致,而koa可以配合async和await对异步函数进行同步化,进一步规划函数运行。
2. 结构方面:
两者的设计结构基本类似。
运作结构方面,同步函数作为中间件时,则两者都符合洋葱模型。但异步函数作为中间件时,koa符合洋葱模型而express不符合洋葱模型。
框架使用:
express:
首先express本身是一个createApplication函数,因为是函数,则使用express时调用函数即可,
const express = require('express')
const app = express()
而当调用listen函数时,本质上是新建原生http服务器http.createServer 然后调用listen 方法。
而使用app.use() 时,本质上是寻找router中的use方法,然后在router中进行处理。而router处理需要传入一个回调函数,router本身会返回一个request_handle ,也就是本质上调用的是你传入的回调函数。
当使用express的next方法时,处理原理是本身源码app中会有一个middleware 数组,内部成为stack,然后调用use/get/post等方法时传入的中间件,都会被放入这个数组中,然后express设计内部有一个计数器idx,调用一个next() ,则idx + 1,然后重复一遍调用,因为idx对数组的指向向后移了一位,则调用下一个中间件。
koa:
koa本身是一个Application类,因为是类,则使用koa时需要新建一个类,
const Koa = require('koa')
const app = new Koa()
koa的listen函数相似。
koa调用use函数时,多个中间件也需要进行调用next()才能执行下一个中间件,因为koa源码本身不带有router,所以本身他的运行就是在application中调用的use,但是koa本身只有use方法,没有get/post/put/delete/patch等方法,需要借助@koa/router来进行请求或接口地址的过滤。在调用use方法时,内部也有一个muddleware数组,但是不同的是,koa在执行中间件时,会将所有的中间件进行整合,然后一起作为compose方法的参数,然后compose方法又去调用handleRequest方法,最终调用fnMiddleware函数,对中间件进行处理,中间件的处理方式和express类似,也是设置一个指针i,然后dispatch(0)调用第一个中间件,然后调用midllware数组中的i+1,继续调用下一个中间件,等到所有的中间件执行完成后,才对返回体进行处理,将结果返回。也就是说,koa是先把所有的中间件处理完成后,才会对body进行返回,不会设置一次ctx.response.body就返回一次响应。