Express源码解析(一)

每天学一点,分享我的所得。
Express算是nodejs最知名的框架了。即使nodejs掌握的不多,也能使用简单几条语句,轻松创建web服务器。如此便捷,那它是如何工作的呢,今天我们就来瞧一瞧(Version:4.17.1)。
首先,看一下express源码的结构。

中间件、路由、基于node的http模块封装的request和response、还有公用方法,一共只有11个文件,却实现的强大的功能,这代码质量,不得不佩服。按照我的思路一个个解析(看源码要细,慢慢理解

  1. express.js
    项目入口文件。先找导出部分
// 默认导出 createApplication函数
exports = module.exports = createApplication;

这里有一个知识点:exports和module.exports的区别和用法。简单说一下。module.exports和exports默认指向同一个地址一个空对象,module.exports为nodejs文件的默认导出。当module.exports指向了新的对象,则exports指向的地址对导出无效。上面这种写法,是将exports和module.exports进行强绑定。
接下来看这个导出函数

function createApplication() {
  var app = function(req, res, next) {
    app.handle(req, res, next);
  };
  mixin(app, EventEmitter.prototype, false);
  mixin(app, proto, false);
  // expose the prototype that will get set on requests
  app.request = Object.create(req, {
    app: { configurable: true, enumerable: true, writable: true, value: app }
  })
  // expose the prototype that will get set on responses
  app.response = Object.create(res, {
    app: { configurable: true, enumerable: true, writable: true, value: app }
  })
  app.init();
  return app;
}

利用mixin函数给app对象添加属性,false不覆盖属性。proto这个文件里有很多方法都是app.xx的属性,之后以req和res为原型创建对象,并添加新属性app。暴漏出去。之后执行proto里面的init方法。返回app对象。
由此可见所有的秘密都在application.js文件里。

  1. application.js
    老规矩先找module.exports的位置
var app = exports = module.exports = {};

导出app对象,该对象上有express().xx全部的方法。按调用顺序,直接先看init方法。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容