一,开篇分析app
你们好,今天这篇文章主要是对"Connect"中间件以及相关辅助中间件,作一个源码分析系列,我想上一篇文章你们也看了,源码分析
介绍了使用方式及用途,而这篇也是出于本人的兴趣,让读者对其有一个更深刻的认识,如在分析阶段有什么不正确的地方,请你们多多指教,ui
好了!老规矩然咱们进入正题。先来看一个例子,结合会用引入分析,以下:this
二,逐行分析:spa
(1),第一行,引入"connect"模块,经过connect建立一个http|https server,提供http server的全部功能。.net
"connect"中间件容许你用多种方式建立"server", prototype
那么它是如何作的那,看源码:设计
将“createServer”挂载到全局的“exports”上,而后再扩展一个“createServer”属性再次挂载,目的是为了兼容原生的书写形式,code
达到了不一样方式建立的目的。这也是你们在平时开发中能够借鉴的思想。server
(2),再来看第二行"connect.createServer",作了什么那,看以下源码:
"HTTPSServer"和"HTTPServer"基本一致,只是"HTTPSServer"封装的https的方法。在"createServer"的时候,一样能够传递进去一系列的中间件,和随后引入的效果是同样的,不过却只能绑定到根目录上。
(3),继续看第三行"app.use()",作了什么那,看以下源码:
“connect"是原型继承于"http server"的,它会用use到的中间件替换掉server的requestListener。
经过"connect.use(route, handle)"来对每个路由添加中间件,这些中间件"handle"会与"route"绑定保存在一个"stack"里面,每次有"request"请求的时候,
遍历这个堆,找到对应"route"的"handle",执行"handle",若是"handle"最后调用了"next()",就会继续寻找并执行下一个匹配的"handle"。
经过封装"handle",能够很容易的在"connect"基础上添加更多的"middleware"。
(4),最后看看"listen(8888)",它作些什么工做那?
很简单,经过继承底层的Server对象,赋予了"listen"的功能,监听特定端口。
Server.prototype.__proto__ = http.Server.prototype
如下是”connect.js“的所有源码,为了节省篇幅,注释已所有删掉,以下图:
补充一下:
将"middleware"对象"exports",而后循环定义给"middleware"对象一种方法,这种方法是直接加载 "middleware" 文件夹中的.js文件模块。
利用:"exports.utils.merge(exports, exports.middleware)" 这句话将middleware中的方法直接exports了。
三,总结一下:
(1),理解源码的设计意图,有助于在应用上获得最大化的收获。
(2),看源码时,理解流程再去扣语法细节。
(3),借鉴源码中的巧妙实现思想,但不要过渡设计,为了设计而设计。
(4),明天继续分析相关中间件,不断更新中 。。。 。。。