当前位置: 首页 > 后端技术 > Node.js

Express分析对比

时间:2023-04-03 14:26:49 Node.js

前言express最新版本是4.16.2,所以本文的分析也是基于这个版本。目前从npm仓库来看,express的使用率相当高,express的月下载量是koa的40倍左右。因此,目前研究express还是很有意义的。源码分析直接切入正题,因为express目前是一个独立的路由和中间件web框架。因此,分析的方向主要以这两个为主。源码研究只关注关键步骤和流程思路,并没有过多关注具体的hack、异常、边界处理。关键步骤中间件的执行/***//负责具体请求的逻辑处理,当执行到一维层中对应的栈时,执行done(目的是匹配并执行next中的路由一维路由表)。*@paramdone(nextinrouting)*/Route.prototype.dispatch=functiondispatch(req,res,done){varidx=0;varstack=this.stack;下一个();//递归执行栈层中层通过nextfunctionnext(err){//如果出错,直接退出当前栈和路由列表中callback的后续执行if(err&&err==='router'){returndone(err)}//如果出现错误,直接退出当前栈列表,进行后续执行,继续进行下一条路由匹配if(err&&err==='route'){返回完成();}varlayer=stack[idx++];//执行结束if(!layer){returndone(err);}if(layer.method&&layer.method!==method){returnnext(err);}//调用特定的注册逻辑if(err){layer.handle_error(err,req,res,next);}else{layer.handle_request(req,res,next);}}};注意,以上是对源码的部分总结,去掉了无关信息,标注了关键步骤。路由匹配/***针对特定请求的路由分发处理*out是最后一个处理器,默认是请求的回调,如果不通过,就是内部提供的错误处理器*/proto.handle=functionhandle(req,res,out){varself=this;变量idx=0;varparamcalled={};//中间件和路由varstack=self.stack;vardone=restore(out,req,'baseUrl','next','params');下一个();//递归遍历注册的一维路由functionnext(err){varlayerError=err==='route'?空:错误;变层,匹配,路线;//取出注册的一个Routing,请求匹配while(match!==true&&idxmiddleware(middlewareAPI))dispatch=compose(...chain)(store.dispatch)//compose.jsexportdefaultfunctioncompose(...funcs){returnfuncs.reduce((a,b)=>(...args)=>a(b(...args)))}组合起来最后执行,就是洋葱模型效果,比如compose(a,b,c)变成了a(b(c())),a,b,c的结构类似于下面的形式functionfnA(next){returnfunction(){console.log('fnAstart')next()安慰。log('fnAend')}}所以当a(b(c()))()执行时,会使用next来控制调用下一个中间件。整体执行相当于express递归调用方法expressrouting和vueroutes有什么共同点vue也有routing。官方的vue-router解决了url和template组件匹配渲染的问题,而express解决了url和handler匹配执行的问题,koa内核中没有集成路由。从vue-router和express路由可以看出路由的共性,就是解决web开发中路径和相应处理逻辑的匹配问题。toy版express基于以上分析的逻辑,实现了express的简化版,融入了express的核心思想,并有详细的步骤注释,需要的可以参考。参考源码版本说明express4.16.2koa2.2redux3.7.2参考链接https://github.com/koajs/koa/...https://www.reddit.com/r/node...https://blog.jscrambler.com/m…