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