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

在 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