📅  最后修改于: 2023-12-03 15:17:40.493000             🧑  作者: Mango
在 Node.js 中,我们经常使用 module.exports
来将模块中的代码暴露出去,以便在其他模块中使用。但是,还有一种等效的方式可以实现同样的效果,它就是使用 exports
变量。
module.exports
和 exports
的区别在 Node.js 中,每个模块都有一个 module
对象,它表示当前模块。module
对象有一个 exports
属性,它是一个对象,我们可以将需要暴露的代码赋值给它,从而让这些代码可以被其他模块调用。例如:
// 模块1
function add(a, b) {
return a + b;
}
module.exports = { add };
// 模块2
const module1 = require('./module1');
const result = module1.add(1, 2);
console.log(result); // 3
在上面的代码中,我们将 add
函数赋值给了 module.exports
对象,然后在另一个模块中通过 require
方法加载 module1
模块,并调用 add
函数。
但是,其实在 module
对象中还有一个属性叫做 exports
,它是 module.exports
的一个引用。也就是说,下面这两个语句是等效的:
module.exports.add = add;
exports.add = add;
可以简写成:
exports.add = function add(a, b) {
return a + b;
};
当使用 exports
变量时,它指向的是 module.exports
,也就是说,如果你修改了 exports
变量的指向,那么 module.exports
就会失去作用。例如:
// 模块1
exports = { add };
这样写是不起作用的,因为它只是让 exports
指向了一个新的对象,但是由于 module.exports
没有改变,所以 add
函数并没有被暴露出去。
exports
的使用虽然 exports
只是 module.exports
的一个引用,但是它更加方便我们直接暴露一些对象或函数。例如:
// 模块1
exports.add = function add(a, b) {
return a + b;
};
exports.sub = function sub(a, b) {
return a - b;
};
这样写可以直接将 add
和 sub
函数暴露出去,而不需要再写一个对象来包装它们。
虽然 module.exports
和 exports
都可以用来将模块中的代码暴露出去,但是它们之间还是有一些细微的区别。在大多数情况下,使用哪个都可以,只要我们清楚它们的区别和语法。