下面给你一份最清晰、最容易记住的《Node.js 中 exports 与 module.exports 的区别》总结。这是面试、高级开发必考内容。


🚀 Node.js 中 exportsmodule.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