exports是module.exports的初始引用,二者初始指向同一对象;但重赋值exports会断开关联,仅module.exports决定require导出内容。

区分 exports 和 module.exports,关键就一点:它们初始指向同一个对象,但 exports 只是个“快捷引用”,真正起作用的是 module.exports。
exports 是 module.exports 的初始引用
Node.js 在每个模块开头自动执行类似这样的代码:
const exports = module.exports;
所以一开始 exports === module.exports 为 true,两者都指向一个空对象 {}。你可以往这个对象上加属性,比如:
立即学习“Java免费学习笔记(深入)”;
-
exports.name = 'Tom';→ 有效,module.exports 也获得 name 属性 -
exports.say = () => console.log('hi');→ 有效,外部能调用
重新赋值 exports 会断开连接
一旦你写 exports = { ... } 或 exports = function() {},就相当于让 exports 指向一个新对象,而 module.exports 还留在原地。结果是:
- require 加载到的仍是 module.exports 的原始值(通常是空
{}) - 你赋给 exports 的新内容完全不会被导出
- 常见错误示例:
exports = { data: 42 };→ 外部得到{}
module.exports 才是真正的出口
无论你对 exports 做了什么,require 的结果只取决于 module.exports 当前的值。所以:
- 导出单个函数、类、字符串或数字,必须用
module.exports = ... - 导出多个方法/属性,可以用
module.exports = { a(), b };或逐个挂载exports.a = ... - 混用要小心:先写
exports.x = 1,再写module.exports = () => {},后者会覆盖前者
什么时候该用哪个?
简单记:想导出整个对象、函数、基本类型,直接用 module.exports;只想添加几个属性又不想改整体结构,exports.xxx 安全又简洁。


















