下面给你一份最清晰、最容易记住的《Node.js 中 exports 与 module.exports 的区别》总结。这是面试、高级开发必考内容。
🚀 Node.js 中 exports 与 module.exports 的区别(终极解释)
在 Node.js 中,每个文件都是一个模块,模块对外暴露内容依赖 module.exports。
而 exports 只是 module.exports 的一个 引用(简写)。
理解这句话就够了:
module.exports 才是真正的导出对象;
exports 只是指向 module.exports 的一个变量。
一旦两者“不指向同一个对象”,exports 就失效了。
⭐ 一、核心原理(一句话解释清楚)
Node.js 加载一个模块时,会自动包装成:
(function(exports, require, module, __filename, __dirname) {
// 你的代码
});
进入函数后:
exports = module.exports;
也就是说:
📌 exports 和 module.exports 初始时指向同一个空对象 {}。
📌 但最终真正导出的,是 module.exports。
⭐ 二、什么时候用 exports?(简写形式)
适用于逐个挂载属性:
exports.a = 1;
exports.b = function () { };
等价于:
module.exports.a = 1;
module.exports.b = function () { };
✔ 只要你 不修改 exports 的指向,它就能正确工作。
⭐ 三、什么时候 exports 会失效?(面试常问)
当你做了“重新赋值”:
exports = { a: 1 };
⚠ 此时 exports 不再等于 module.exports,只是一个局部变量。
真正导出的仍然是原来的 module.exports。
也就是说:
exports 不能用来直接赋值对象,只能添加属性。
⭐ 四、正确导出对象的唯一方式
如果你要导出一个对象、类、函数:
module.exports = {
a: 1,
b() {}
};
或者:
module.exports = function() {};
必须用 module.exports。
⭐ 五、常见错误示例(一定要避免)
❌ 错误:想导出对象却用 exports 赋值
exports = {
a: 1
};
结果用户 require 后得到的是:{}
因为:
- Node.js 导出的是
module.exports - 你改的是
exports的引用
⭐ 六、正确示例总结
✔ 导出多个属性 → 用 exports 或 module.exports 都行
exports.a = 1
exports.b = 2
✔ 导出整个对象 → 必须用 module.exports
module.exports = { a: 1, b: 2 }
✔ 导出一个函数 → 必须用 module.exports
module.exports = function() {}
⭐ 七、终极记忆口诀
📌 exports 是 module.exports 的“引用”
📌 最终导出的是 module.exports
📌 不要用 exports = …,要用 module.exports = …
再总结一句:
添加属性用 exports,替换对象用 module.exports
发表回复