11

[笔记] Express4.x 源码-01

express

express.js

  • mixin()

    EventEmitter.prototype, application 中的与 app 中不重名的属性添加到app 中去。目的是使 app 可以使用 application 模块中的很多方法。至于为什么不直接继承是因为JS 中不支持多继承。

  • app.request | app.response

    使用 Object 创建继承于 request, response模块的属性,来提供一个接口供 app 实例使用。

  • app.init

    初始化app实例。这个方法在application中查看。主要做的事情是初始化缓存,模板引擎,全局设置。

    具体详见 application 部分。

  • 使用 exports, module.exports 来导出 express 方法, 其他部分也一并导出,
    application, request, response, Router, Route, query, static 这些模块。

  • 最后一部分主要是对分离的其他中间件进行警告,如果想通过express().json这种形式调用的话

// 在这一部分中,主要是对对象属性的各种操作,一下四个方法是在该文件中经常使用的
    Object.getOwnPropertyNames(obj)
    Object.getOwnPropertyDescriptor(obj, name)
    Object.hasOwnProperty(obj, name)
    Object.defineProperty(obj, name, descriptor)

merge-descriptors.js

这个模块也就是上文中提到的 mixin() 模块,这部分的核心代码久20-30行,Object.getOwnPropertyNames(src).forEach() 来获取所有自带属性,forEachOwnPropertyName(name) 用来将每个属性定义到目标对象上。

这一部分主要是以下代码:

// 获取每个属性的描述符
var descriptor = Ojbect.getPropertyDescriptor(obj, name);

// 定义每个属性
Object.defineProperty(dest, name, descriptor);

application.js

  • app.init()

    初始化缓存对象 cache, engines, settings,具体的实现在defaultConfiguration()

  • app.defaultConfiguration()

  • app.set()

    app.settings 中的值进行设定, 如果没有指定值,那么将返回当前 setting 项的值,在这个函数中

    etag, query parser, trust proxy进行了特殊的处理。

    • etag 当需要设置的值是该字段的时候,app会添加一个 etag fn 函数用来编译给定的etag 值,如果 值为一个函数的时候,etag fn 的值会直接被设置为指定的函数;如果值为 true 或者 weak时,则将函数设置为内置的 wetag.如果为 false , 则fn 的值为undefined。
    • query parser 作用同上方的etag 类似,根据不同的值设置不同的解析方法
    • trust proxy fn 作用同上方的etag 类似
    // 坑待填
    
  • app.param(name, fn)

    • this._router 首先调用 app.lazyrouter() 来对app._router 私有变量进行初始化通过使用 new Router({})。值得一提的是 Router 中的setPrototyof(o, proto)方法在内部实现上将 o.__proto__赋值为 proto对象。 在这个例子中,也就是构造函数本身。然后将配置中的 caseSensitive, mergeParams, strict 参数赋值给相应的内部变量。

router/layer.js

构造函数 Layer 构造一个包括 路径的处理函数 handle,处理函数的名字 fn.name,参数 params, path, regexp 等属性。然后再给Layer函数增加

handle_request, handle_error, match 三个函数。分别用来处理正常的request, error, path

[笔记] Express4.x 源码-02