Skip to content

Latest commit

 

History

History
66 lines (50 loc) · 2.08 KB

File metadata and controls

66 lines (50 loc) · 2.08 KB

express.js

模块导入

var EventEmitter = require('events').EventEmitter;
var mixin = require('merge-descriptors');
var proto = require('./application');
var Route = require('./router/route');
var Router = require('./router');
var req = require('./request');
var res = require('./response');

快速引入某些模块

代码主体

1.入口文件index.js只有一句代码 module.exports = require('./lib/express.js');
因此我们首先从express.js开始看.

exports = module.exports = createApplication;


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;
}

这部分代码是express.js主要内容,暴露了一个创建方法.方法里面的app也是一个函数。
至于为啥用一个函数而不用对象暂时没想到。然后用混入mixin方法获取EventEmitter.prototypeapplication.js里面暴露的方法和属性. 然后再给app两个属性requestresponse 这个两个属性是用Object.create函数生成 既继承了response.js request.js所暴露的东西,还设置文件标识符的值.最后再调用application.js的init方法并返回app。

exports.application = proto;
exports.request = req;
exports.response = res;

exports.Route = Route;
exports.Router = Router;

exports.query = require('./middleware/query');
exports.static = require('serve-static');

这部分代码是express.js另一半内容,这里的作用是为createApplication方法添加属性虽然不是很懂这样暴露有什么意义.

由于app.init看上去做了好多事情,接下来去看application.js