Nodejs 请问module.exports 与exports的区别
Nodejs 请问module.exports 与exports的区别
如果,欢迎大家来讨论!
Node.js 中 module.exports 与 exports 的区别
在 Node.js 中,module.exports 和 exports 都用于导出模块中的功能。虽然它们看起来相似,但它们之间存在一些重要的区别。
1. module.exports
module.exports 是一个对象,它直接定义了模块对外暴露的接口。当你使用 require() 加载模块时,返回的就是 module.exports 对象。
// moduleExportsExample.js
module.exports = {
sayHello: function() {
console.log("Hello, World!");
}
};
在这个例子中,当我们通过 require() 加载这个模块时,返回的对象就包含 sayHello 方法。
2. exports
exports 是一个指向 module.exports 的引用。默认情况下,exports 是一个空对象 {}。你可以向这个对象添加属性来导出模块的功能。
// exportsExample.js
exports.sayHello = function() {
console.log("Hello, World!");
};
在这个例子中,我们向 exports 对象添加了一个 sayHello 方法。加载该模块时,返回的对象也包含 sayHello 方法。
区别
- 赋值 vs 修改:
- 如果你直接用
=给module.exports赋值,那么exports将不再指向module.exports。 - 如果你使用
exports添加方法或属性,则不会影响module.exports。
- 如果你直接用
例如:
// moduleExportsExample.js
module.exports = {
sayHello: function() {
console.log("Hello, World!");
}
};
// exportsExample.js
exports = {
sayHello: function() {
console.log("Hello, World!");
}
};
在第一个例子中,module.exports 被赋值为一个新对象,而 exports 仍然是空对象。在第二个例子中,exports 会尝试修改 module.exports,但由于 exports 只是一个引用,所以实际上并没有改变 module.exports 的值。
总结
- 使用
module.exports直接赋值可以完全替换模块的导出对象。 - 使用
exports添加属性或方法更符合直觉,但需要注意不要直接用=赋值,否则exports将失去对module.exports的引用。
希望这些示例和解释能帮助你理解 module.exports 和 exports 的区别!
up
Google 了一遍发现回答了两遍了… 当然我也没记住 http://cnodejs.org/topic/4faf88ee9f281d96650030aa http://cnodejs.org/topic/4f7523168a04d82a3d4446df 英文的: http://stackoverflow.com/questions/6116960/what-do-module-exports-and-exports-methods-mean-in-nodejs http://stackoverflow.com/questions/7137397/module-exports-vs-exports-in-nodejs http://www.hacksparrow.com/node-js-exports-vs-module-exports.html
当然可以。module.exports 和 exports 都是用于在 Node.js 中导出模块中的对象或函数,但它们有一些重要的区别。
区别
-
exports是module.exports的一个引用:- 当你在文件中使用
exports关键字时,实际上是操作module.exports对象。 - 如果你直接赋值给
exports(例如exports = someFunction;),它将覆盖原来的引用,而不是修改module.exports。
- 当你在文件中使用
-
module.exports是最终被导出的对象:- 最终,其他文件通过
require引入的是module.exports而不是exports。 - 如果你需要完全替换导出的对象,你应该使用
module.exports。
- 最终,其他文件通过
示例代码
// moduleExportsExample.js
function myFunction() {
console.log('Hello from myFunction!');
}
// 使用 exports 导出
exports.myFunction = myFunction;
// 使用 module.exports 完全替换导出
module.exports = {
anotherFunction: function() {
console.log('Hello from anotherFunction!');
}
};
假设你有一个另一个文件 main.js:
// main.js
const exampleModule = require('./moduleExportsExample');
exampleModule.myFunction(); // 输出 "Hello from myFunction!"
exampleModule.anotherFunction(); // 输出 "Hello from anotherFunction!"
在这个例子中,myFunction 是通过 exports 导出的,而 anotherFunction 是通过 module.exports 完全替换导出的。
总结
- 使用
exports是为了添加属性到module.exports。 - 使用
module.exports可以完全替换导出的对象。 - 如果需要完全替换导出的对象,最好使用
module.exports。


