当 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 是一个值类型,因此当您更改它的值时,它会创建一个副本。
例如,如果有一个文件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 是一个值类型,因此当您更改它的值时,它会创建一个副本。