当 Node.js 中的多个文件需要一个模块时会发生什么情况?

What happens when a module is required by more than one file in Node.js?

例如,如果有一个文件foo.js,其中一个变量x初始化为数字1。 x 是从文件中 module.export 编辑的。现在,如果在另外两个 javascript 文件中需要 foo.js,并且 x 的值在这两个文件中分别更改为值 5 和 10。在这种情况下到底发生了什么?是否存在三个不同的 x 副本,或者只有一个 x,并且取决于哪个文件是最后一个 运行,x 将保留该值?

对 require() 的调用被缓存,所以应该不会有太大的区别 此外,对 require() 的调用是阻塞的,因此当它们被处理时,Node.

没有其他任何东西被 运行

如果 x 是不可变值,那么在您的方案中它将作为 1 传递给这两个文件。如果稍后在其他文件中更改x。原来的x不会变。

// foo.js
let x = 1;
setTimeout(() => {
    console.log('original: ', x);
}, 1000);
module.exports = x;

//a.js
let x = require('../lib/foo');
x = 2;
console.log('required x: ', x);

//output
require x:  2
original:  1

如果x是可变值,那么无论在哪里改变它,都会影响所有x使用它的地方。

// foo.js
let x = {
    a: 1
};
setTimeout(() => {
    console.log('original: ', x);
}, 1000);
module.exports = x;

//a.js
let x = require('../lib/foo');
x.a = 2;
console.log('required x: ', x);

//output
require x:  {a: 2}
original:  {a: 2}

其实要看x是引用类型还是值类型。如果 x 是引用类型,那么它在一个文件中的 属性 的变异会反映在另一个文件中。

在您的示例中,x 是一个值类型,因此当您更改它的值时,它会创建一个副本。