Node.js 中 module.exports 和 exports 的区别是什么?

在 Node.js 中,module.exports 和 exports 都用于导出模块内容,但它们之间存在关键区别。exports 是 module.exports 的引用,但在赋值操作时行为不同。

Node.js 中等 模块系统 模块 导出

在 Node.js 模块系统中,module.exportsexports 都用于导出模块内容,但它们在本质和使用上存在关键区别。

  1. 核心区别
    • module.exports 是模块实际导出的接口,require() 返回的对象正是 module.exports
    • exports 仅是 module.exports 的一个引用,即在模块初始化时自动设置 exports = module.exports,指向同一内存地址。这意味着二者初始时相等:exports === module.exportstrue
  2. 使用行为不同
    • 添加属性时:向 exportsmodule.exports 添加属性(如 exports.a = ...),二者共享变化。
      // 正确示例:都添加属性
      exports.addFunc = () => { return 1 + 2 };  // 等效于 module.exports.addFunc
      
    • 赋值时:如果直接给 exports 赋值一个新对象,它将断开与 module.exports 的链接,导致导出失效,因为 require() 仍然只认 module.exports。反之,直接覆盖 module.exports 能正确导出新值。
  3. 推荐场景
    • 添加多个成员时:用 exports.key = value(便利短记法)。
    • 导出单个类、函数或值时:必须用 module.exports = ...,避免 exports = ... 导致断开引用。
  4. 常见误区
    • 以为 exports 等同于 module.exports:当发生赋值操作,exports 被重定时不再有效。
    • 返回数据解析:模块导出的始终是 module.exports 的最终值。

总体上,优先使用 module.exports 以确保稳定性。