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