Express.js|源码分析

秋招压力太大、没有时间放松那就。。。看源码吧。

Express源码可以从github上pull,第一次需要npm下载依赖(也可以不下,纯看它的源码。。)

 

NewImage

教科书式目录结构,猜测从上到下应该是性能测试工具、简单的starter、源码、依赖和单元测试模块。

打开index.js

NewImage

直接将lib下源码导出成模块,转到目标目录下

NewImage

中间件?、路由和一些定义,就是经常用到的一些“Class”,入口在express.js

NewImage

express的一些基本依赖,自从4.x之后移除了connect,解除了大部分中间件,更加轻量化,body-parser从某版本起内置。。

NewImage

一些自带的方法其实还是源自于body-parser

NewImage

最下方是一个对“过气“中间件的检测

重点来了,createApplication这个函数,相当于入口

NewImage

首先,它创建了一个 app 函数并且执行了handle,直接看的话可能比较懵,但是重点在下面两段。

mixin这个包的作用:

NewImage

这是mixin的原型,他将src中的所有“属性”都“克隆”到了dest中,同时

NewImage

第三个参数设置为false则会发生属性覆盖。

app GET到了事件系统和proto的所有属性,接下来进入proto,看一下handle:

NewImage

可以猜测这个handle应该与我们日常写的方法有很大关联,尤其是那些参数,特别像 .get/.post 的handler

它首先检测了自己的callback,来判断自己是否为“最终”的Handler,如果用户为定义callback那么使用这个handler,finalHandler部分源码如下:

NewImage

没错,正是报错页面,在finalHandler中定义了多种错误,识别环境变量是否为dev,来决定输出合适的错误

NewImage

在handle中有一个router,用来处理路由:

NewImage

_router源码如下:

NewImage

如果当前不存在一个lazyrouter,那么创建,继续深入查看Router源码:

NewImage

Router中的初始化部分,需要注意的是,此handle非application中handle,而是Router自己的:

NewImage

此处显然是Router的初始化过程,router/index.js中还有一些工具方法,暂时略过。。。。

回到lazyrouter处,这里就可以解释为express路由系统的初始化阶段

NewImage

下面两段use,在Router中,use逻辑如下:

NewImage

NewImage

首先过滤参数,取得参数中的function或目录

接着定义了callbacks 根据之前的判断,如果第一参数不是一个function,且Array[0]也不是function,那么callbacks为空,将第0存为path,对数组降维(之后的默认均为函数?)

如果第一参数是function或Array且第0为function,那么继续,否则return this,可继续链式调用。

完成参数过滤后,设置一些参数遍历入栈,由下面逻辑可推断use的参数应该为一个function或一个Array,Array的0位应该是一个path(路由?)或一个function,之后的位如果有参数必须是function

NewImage

返回Router初始化中,首先它加入了一个query,源码如下:

NewImage

先来了一个合并(???没看懂的操作,“不要问,问就是解耦”)问题A.

qs中的parse源码如下:

NewImage

normalizeParseOptions是一个配置识别器,包含了一些类型判别和默认配置,这个qs用于url的stringify和parse

如果query手动指定了option则不使用qs.

回到Router,第二个use是初始化中间件,参数等:

NewImage

包括默认设定了一个服务器标示,设置req/res,默认是直接搬http包中的

req/res来用,附加一些工具方法。

以上是express启动过程,总结来说:

加载路由->装载中间件->初始化一些参数->初始化完成,其中listen也是使用了http的creatServer包装listen。

 

 

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Loading...