两种模块到处方式
-
exports.xxx = ...
-
module.exports = ...
1. exports.xxx = ...
-
exports
是module.exports
的一个引用(快捷方式)。 -
当你写
exports.foo = function() {}
,实际上就是给module.exports
对象添加了一个foo
属性。 -
这种方式适合导出多个属性或方法,类似给模块导出一个对象,里面包含多个键值对。
// example.js
exports.sayHello = () => {console.log('Hello');
};
exports.value = 123;
使用时:
const example = require('./example');
example.sayHello(); // Hello
console.log(example.value); // 123
2. module.exports = ...
-
module.exports
是最终模块的导出对象,Node.js 会返回它给require
调用方。 -
你可以直接把它赋值为任意值(对象、函数、类等),覆盖默认的空对象。
-
当你需要导出一个整体,比如一个函数或者一个类,通常用这种方式。
// example2.js
module.exports = function() {console.log('I am a function');
};
使用时:
const example2 = require('./example2');
example2(); // I am a function
关键区别点
方面 | exports.xxx = ... | module.exports = ... |
---|---|---|
导出内容 | 给导出对象添加属性,保持默认对象结构 | 直接替换导出对象 |
使用场景 | 导出多个方法/属性组成的对象 | 导出单个函数、类或自定义对象 |
赋值操作影响 | 修改 exports 的属性,不影响引用 | 直接赋值替换 module.exports |
注意事项 | 不能直接给 exports 赋值,否则断开引用 | 赋值给 module.exports 是推荐方式 |
常见错误示范
// 错误写法 - 断开 exports 与 module.exports 引用
exports = function() {console.log('hello');
};
// 这样 require 时拿到的其实是 module.exports 的默认空对象 {}
总结
-
exports
是module.exports
的快捷方式,不要直接给exports
重新赋值。 -
推荐直接用
module.exports = xxx
,尤其是导出单一对象、函数或类时。 -
用
exports.xxx = ...
来给导出对象添加多个属性和方法。
需要我帮你写几个例子来演示,或者帮你讲解它们内部的引用机制吗?
二、推荐统一只使用一个用法,例如module.exports
module.exports
是 Node.js 模块导出的根本对象,直接操作它可以让代码更清晰和一致。
确实,推荐大家**统一使用 module.exports
**来导出模块内容,这样:
-
只需记住一种导出方式,避免混淆
-
可以随时导出整个对象、函数或类
-
避免误用
exports
断开引用导致导出失效的问题
比如你可以直接这样写:
module.exports = {foo: () => { console.log('foo'); },bar: 123,
};
或者导出单个函数:
module.exports = function() {console.log('hello');
};
这样更直观,也避免了用 exports
时容易犯的坑。
总结:
统一使用 module.exports
,简单明了,避免不必要的坑,推荐!
三、module.exports本质是一个对象
1. module.exports
本质是一个对象
在 Node.js 中,module.exports
默认是一个空对象 {}
,你可以像操作普通对象那样给它添加属性(键值对):
module.exports.foo = () => console.log('foo');
module.exports.bar = 123;
这就是“直接把键写上去”的意思:给 module.exports
对象上直接赋属性。
使用时:
const myModule = require('./myModule');
myModule.foo(); // 输出 'foo'
console.log(myModule.bar); // 输出 123
2. 也可以直接整体赋值(替换)
你也可以直接给 module.exports
赋一个新对象(或者函数、类),而不是在它上面添加属性:
module.exports = {foo: () => console.log('foo'),bar: 123,
};
这样写和上面效果是一样的,但一次性把导出内容整体替换了。
3. 不能直接给 exports
赋值(避免断开引用)
很多人误会以为直接给 exports = {...}
也能导出,但这是错的,会导致导出失败。
总结
-
“直接把键写上去”,是指给
module.exports
对象直接添加属性,比如module.exports.foo = ...
-
也可以一次性替换成一个新对象,比如
module.exports = { foo: ..., bar: ... }
-
推荐统一用
module.exports
来避免混淆。