在 CommonJS 模块系统中,有两种不同的方式来导出模块:module.exports
和 exports
。虽然这两种方式看起来很相似,但是它们之间还是有一些重要的区别的。
module.exports
module.exports
是一个完整的对象,可以将其用于导出整个模块。可以通过赋值给 module.exports
来为导出值赋值,例如:
// module.js function sum(a, b) { return a + b; } module.exports = { sum };
在另一个文件中,可以使用 require
函数来加载这个模块,并访问 module.exports
上的属性:
// main.js const myModule = require('./module'); console.log(myModule.sum(1, 2)); // 输出 3
exports
exports
实际上只是对 module.exports
的一个引用。如果尝试直接给 exports
赋值,会打破这个引用关系,从而无法正确地导出模块:
// module.js exports = { // ❌ 这样将不会导出任何东西 sum(a, b) { return a + b; }, };
这是因为 exports
在底层实现中被处理成了 module.exports
的一个局部变量。因此,如果要导出模块,可以给 exports
上添加属性:
// module.js exports.sum = function(a, b) { return a + b; };
与使用 module.exports
相同,也可以在另一个文件中使用 require
来加载这个模块,并访问 exports
上的属性:
// main.js const myModule = require('./module'); console.log(myModule.sum(1, 2)); // 输出 3
区别
虽然 module.exports
和 exports
看起来很相似,但是它们之间还是有一些重要的区别。最关键的区别就是 module.exports
可以被赋值为任意对象,而 exports
只能添加属性。由于 exports
是对 module.exports
的一个引用,因此当 exports
被重新赋值时,会打破这个引用关系,从而无法正确地导出模块。
另外,由于 module.exports
是一个完整的对象,因此可以将其用于导出整个模块,或者导出一个构造函数或类等复杂类型。而 exports
只能用于导出单个属性或方法等简单类型。如果需要导出多个属性或方法,则必须将它们全部添加到 exports
对象上。
示例代码
以下示例展示了如何使用 module.exports
和 exports
导出模块:
-- -------------------- ---- ------- -- --------- -------- ------ -- - ------ - - -- - -------------- - - --- -- -- ------ ---------------- - ----------- -- - ------ - - -- -- -- ------ ---------------- - ----------- -- - ------ - - -- -- -- ------
// main.js const myModule = require('./module'); console.log(myModule.sum(1, 2)); // 输出 3 console.log(myModule.subtract(4, 2)); // 输出 2 console.log(myModule.multiply(3, 5)); // 输出 15
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/9381