直接给 exports 赋值会切断其与 module.exports 的引用关系,导致导出失效;应只通过 exports 添加属性,或直接赋值 module.exports 来整体替换导出内容。

直接给 exports 赋值(比如 exports = { ... })会切断它和 module.exports 的引用关系,导致 require() 拿到空对象或旧对象。这不是语法错误,但导出失效——问题出在“赋值”动作本身。
只往 exports 上添加属性,不重赋值
这是最安全、最常用的做法。初始时 exports 和 module.exports 指向同一个空对象,所以给它加属性,等于在 module.exports 上加:
exports.add = function(a, b) { return a + b; };exports.name = 'calculator';exports.version = 1.0;
这样所有属性都会被正常导出,require('./math') 得到的就是带这些属性的对象。
想整体替换导出内容,直接用 module.exports
当你需要导出一个函数、类、字符串、数组或全新对象时,不要碰 exports 的指向,而是直接赋值给 module.exports:
立即学习“Java免费学习笔记(深入)”;
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
module.exports = function(name) { return `Hello ${name}`; };module.exports = class Logger { ... };module.exports = { add, subtract, multiply };
这一步完全绕过 exports,避免任何引用断裂风险。
混用时注意顺序和覆盖逻辑
如果先用 exports.xxx = ... 添加了一些东西,又紧接着写 module.exports = ...,前面的添加会被清空——因为 module.exports 被整个替换了:
- ❌ 错误示范:
exports.foo = 1;<br>module.exports = { bar: 2 }; // foo 丢失 - ✅ 正确做法:要么全用
exports增量添加,要么全用module.exports一次性定义
养成统一风格,优先用 module.exports
团队协作或长期维护项目中,建议统一使用 module.exports。它语义明确、行为稳定,不会因“忘了不能赋值”而埋坑:
- 导出多个东西 →
module.exports = { a, b, c }; - 导出单个函数 →
module.exports = function() { ... }; - 导出类 →
module.exports = class X { ... };
这样既避免理解成本,也杜绝了误操作可能。

















