Skip to content

Express

仓库地址

Express 源码
本次调试源码仓库

调试说明

本地源码调试修改了官方库中(主体代码及测试代码),并且引用了 ES6 语法(不考虑低版本 Node 的支持)。如果您要在项目中使用 Express,请使用官方库或直接执行npm install express

调试流程

  • const app = express()调用的逻辑(应用初始化)
  • app.listen 方法(如何结合 http 模块的)
  • app.use 方法(最基础的中间件调用实现)
  • app.set、app.enable、app.disable、app.enabled、app.disabled 等初始化时涉及到的 app method。逻辑比较简单。
  • app.request(理解 Express 是如何通过原型链修改 req、相关 HTTP 头部功能、express 新增的允许 req.xx 方法)
  • app.response(理解 Express 是如何通过原型链修改 res、相关 HTTP 头部功能、express 新增的允许 res.xx 方法)
  • 跑通单元测试(mocha、supertest、node 中 assert 模块的基本使用)、不断的 debugger...
  • 上述调试(req, res, app.use, app)基础流程中,相关第三方模块源码的了解。涉及到的第三方模块都是一些小模块,不复杂。
  • router/index.js、router/layer.js。通过 app.use 方法调用。以及 request.get('xx')触发回调。理清 app -> router -> layer 的一个流程。 比较复杂的是 router.handle 方法。但只需要关注核心逻辑 - function next。
  • 粗浅了解下 path-to-regexp 这个库的功能。以及调用时 options 的作用。这个库在 vue-router 中也有用到。
  • router 相关,不涉及 HTTP.method 的单元测试
  • app.get/post/... -> router.get/post/... -> route 的调用流程。
  • const router = express.Router(); app.use(pathA, router); router.get(pathB, handler)... 相关的。结合实际项目对 express 的使用情况。通过源码 debugger 理清不同调用方式的区别。以及子 express 应用的实现方式。
  • app.param 实现。这里会再一次的理清 router.handle 方法。之前重点关注的是 next 的实现及调用。这里才是完整的 router.handle 方法实现调用。
  • 单元测试集除了 express.XXX 之外。跑通其他用例。
  • express.static。就是 serve-static 这个库的实现。结合 express 的 express.static.js 测试用例。
  • express.raw/text/url-encoded/json。 就是 body-parser 这个库的实现。同样结合 express 的测试用例。

参考资料

  1. HTTP 标头(header)说明文档
  2. Express4 官方 API 文档