为何Express主模块express.js同时使用exports和module.exports
问题解答
你之前对module.exports和exports的基础理解是对的:默认情况下两者指向同一个对象,如果单独给module.exports赋值新值而不同步更新exports的指向,后续给exports挂载的属性确实不会被导出。
express这么做的核心原因是它在给module.exports赋值的同时,同步更新了exports的指向,核心逻辑如下:
// 先同步修改两个变量的指向,让它们都指向同一个函数对象 exports = module.exports = createApplication; // 后续给exports挂载属性,本质就是给导出的函数对象加属性 exports.Router = Router; exports.Route = Route; exports.application = proto;
函数本身也是JS中的对象类型,给函数对象挂载自定义属性是完全合法的操作。这种写法的好处是兼顾了两种使用场景:
- 用户可以直接调用
require('express')()创建应用实例 - 也可以通过
require('express').Router等方式调用挂载的工具方法,不需要额外嵌套一层导出对象,API设计更简洁。
内容的提问来源于stack exchange,提问作者kankan256
相关产品推荐
相关产品推荐

