区别“模块。出口”和“出口”的CommonJS模块系统

阅读时长 4 分钟读完

在 CommonJS 模块系统中,有两种不同的方式来导出模块:module.exportsexports。虽然这两种方式看起来很相似,但是它们之间还是有一些重要的区别的。

module.exports

module.exports 是一个完整的对象,可以将其用于导出整个模块。可以通过赋值给 module.exports 来为导出值赋值,例如:

在另一个文件中,可以使用 require 函数来加载这个模块,并访问 module.exports 上的属性:

exports

exports 实际上只是对 module.exports 的一个引用。如果尝试直接给 exports 赋值,会打破这个引用关系,从而无法正确地导出模块:

这是因为 exports 在底层实现中被处理成了 module.exports 的一个局部变量。因此,如果要导出模块,可以给 exports 上添加属性:

与使用 module.exports 相同,也可以在另一个文件中使用 require 来加载这个模块,并访问 exports 上的属性:

区别

虽然 module.exportsexports 看起来很相似,但是它们之间还是有一些重要的区别。最关键的区别就是 module.exports 可以被赋值为任意对象,而 exports 只能添加属性。由于 exports 是对 module.exports 的一个引用,因此当 exports 被重新赋值时,会打破这个引用关系,从而无法正确地导出模块。

另外,由于 module.exports 是一个完整的对象,因此可以将其用于导出整个模块,或者导出一个构造函数或类等复杂类型。而 exports 只能用于导出单个属性或方法等简单类型。如果需要导出多个属性或方法,则必须将它们全部添加到 exports 对象上。

示例代码

以下示例展示了如何使用 module.exportsexports 导出模块:

-- -------------------- ---- -------
-- ---------
-------- ------ -- -
  ------ - - --
-

-------------- - - --- -- -- ------

---------------- - ----------- -- -
  ------ - - --
-- -- ------

---------------- - ----------- -- -
  ------ - - --
-- -- ------

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/9381

纠错
反馈