该仓库仅作个人学习express源码使用,对其中的代码(包括主体代码跟单元测试代码进行了改动)。如果您要使用express开发,请访问原框架链接express
如果您不知道该如何开始调试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的单测。