关于node.js:express源码分析1express实例的构造函数

2次阅读

共计 2422 个字符,预计需要花费 7 分钟才能阅读完成。

这篇文章是 express 源码浏览 系列文章的第一篇,这个系列的文章次要目标是想从一个 Node.js 的初学者的视角,联合 express 的 API 文档去剖析解读 express 这个热门库的实现原理。

express 的入口

从使用者的角度来看,express 的入口应该是:

const express = require('express');

通过 express 仓库的 package.json 以及 index.js 能够看出,express 整体的入口位于./lib/express。如下图

./lib/express次要蕴含以下几个局部:

  1. express 实例的构造函数:createApplication
  2. express 提供的实例对象:application、request、response
  3. express 提供的路由性能: Router,Route
  4. express 默认反对的 middlewares: express.json()、express.query()等

这几个局部基本上能够和 express 的 API 文档对应起来

2、3、4 局部次要就是简略的赋值导出,不做过多的剖析

express 实例的构造函数

通常在应用 express 的时候会呈现以下代码:

const express = require('express');
const app = express();

而后面提到的 createApplication 就是对应咱们调用的express().

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 实例的类型

createApplication的返回值是一个function,而且是在 express 应用中很常见的 listener

var app = function(req, res, next) {app.handle(req, res, next);
};

也就是说,创立的 express 实例实质上是一个 listener,至于怎么应用,咱们须要额定延长一下 Node.js 中 http 模块提供的 createServer 办法。上面是一个简略的示例

const http = require('node:http');

// Create a local server to receive data from
const server = http.createServer((req, res) => {res.writeHead(200, { 'Content-Type': 'application/json'});
  res.end(JSON.stringify({data: 'Hello World!',}));
});

server.listen(8000);

联合下面的代码,能够发现 express 实例其实和 Node API 创立一个 HttpServer 所须要的 listener 参数很类似,为了不延长太多额定的常识,咱们先能够简略粗犷的了解为:express 实例其实就是一个封装过的 HttpServer 对应的 listener,这个 listener 会在创立 HttpServer 的时候被应用。

express 实例上的办法挂载

createApplication 中咱们接下来会看到两个 mixin 相干的逻辑
mixin 应用的是 merge-descriptors 这个库,所以这两行实质上都是在拓展 express 实例上的属性和办法。

mixin(app, EventEmitter.prototype, false);

通过合并 EventEmitter 的原型,让 express 实例上领有了 ononce 等这些事件监听办法。

mixin(app, proto, false);

这一行则是给 express 实例上拓展更多的自定义办法,proto内容比拟多,这边不做过多的延长。

express 实例上的 request、response 对象

在创立 express 实例的时候,会给实例减少 requestresponse这两个属性,次要蕴含一下关键点

  1. 它们别离是以 express 本人提供的 requestresponse为原型 创立
  2. express 本人提供的 requestresponse为原型 别离是以 Node。js 的http 模块中的 http.IncomingMessage.prototypehttp.ServerResponse.prototype创立,并在下面拓展了一些自定义办法。
  3. 实例上的 requestresponse属性都额定减少了实例的援用,不便在解决申请和响应的时候,能够同时拜访和批改 express 实例

app.init()

这部分延长的常识比拟多,前面会放在 express 中 application 对象中去剖析。

总结

这篇文章的重点次要剖析了 express 实例的构造函数,函数自身内容比拟少不过十多行代码,然而带出了一个重点常识:express 实例是一个封装过的 HttpServer 对应的 listener,这个知识点将会在前面剖析中经常出现。

正文完
 0