node js中的 module.exports 是否创建导出对象或函数的浅拷贝或深拷贝?

Does module.exports in node js create a shallow copy or deep copy of the exported objects or functions?

例如,

如果我有 2 个模块 try1.js 和 try2.js

try1.js
   module.exports.msg = "hello world";

try2.js
   try1 = require('./try1');
   try1.msg = "changed message";

try2.js 中 msg 内容的变化是否影响 try1.js 中 msg 的试用值?

根本没有复制。 module.exports 是一个对象,该对象是直接共享的。如果您修改该对象的属性,那么所有加载该模块的人都会看到这些更改。

Does the change in the contents of msg made in try2.js affect try value of msg in try1.js?

是的,确实如此。没有副本。 exports 对象是直接共享的。所有使用该模块的人都会看到您对该导出对象所做的任何更改。

仅供参考,模块可以使用 Object.freeze(module.exports) 来防止在添加所需属性后对该对象进行更改。

是的,影响了。尝试执行以下操作。将此代码保存到文件 m1.js:

module.exports.msg = 'hello world';

module.exports.prn = function() {
    console.log( module.exports.msg );
}

然后 运行 节点控制台并尝试以下操作:

> const m1 = require('./m1')
undefined
> m1.prn()
xxx
> m1.msg = 'changed'
'changed'
> m1.prn()
changed