在 CommonJS 中,exports 是 module.exports 的引用,不可直接赋值新对象,否则导出为空;正确方式是为 exports 添加属性或直接赋值 module.exports。

在 CommonJS 规范中,exports 是 module.exports 的一个引用别名,**不能直接赋值给新对象**,否则会断开与 module.exports 的联系,导致模块导出为空({})。要正确导出多个具名变量,必须通过为 exports 添加属性的方式,而非覆盖它。
✅ 正确方式:给 exports 添加属性
这是最常用、最安全的做法。每个具名变量作为 exports 的一个属性被挂载:
// math.js exports.add = (a, b) => a + b; exports.subtract = (a, b) => a - b; exports.PI = 3.14159;
使用时可解构或点访问:
// app.js
const { add, PI } = require('./math');
console.log(add(2, 3)); // 5
console.log(PI); // 3.14159❌ 错误方式:直接赋值 exports
以下写法会导致模块实际导出为 {}(空对象),因为 exports = {...} 只是让局部变量 exports 指向新对象,而 module.exports 仍为初始的空对象:
立即学习“Java免费学习笔记(深入)”;
// ❌ 危险!不会按预期导出
exports = {
add: (a, b) => a + b,
PI: 3.14159
};此时 require('./math') 返回的是 {},所有属性都丢失。
✅ 替代方案:直接操作 module.exports
如果希望一次性导出一个对象(比如想用解构更简洁),应直接赋值给 module.exports:
// math.js
module.exports = {
add: (a, b) => a + b,
subtract: (a, b) => a - b,
PI: 3.14159
};效果与第一种等价,且更直观;但注意:一旦给 module.exports 赋了新值,再操作 exports 就无效了。
⚠️ 混用风险提示
- 不要先赋值
module.exports = {...},又继续写exports.foo = ...—— 后者不会生效 - 也不要先挂载若干
exports.x = ...,再执行exports = {...}—— 前面挂的属性会被丢弃 - 推荐统一风格:要么全用
exports.xxx =,要么直接用module.exports = {...}


















