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

时间:2018-06-28 04:14:07

标签: javascript node.js node-modules

例如,如果存在一个文件 foo.js ,该文件具有变量 x ,该变量以数字1初始化。 x是module.export > ed。现在,如果另外两个JavaScript文件中都需要foo.js,则在这两个文件中x的值都分别更改为5和10。在这种情况下到底会发生什么?是x的三个不同副本,还是只有一个x,并且取决于最后运行哪个文件,x会保留该值?

3 个答案:

答案 0 :(得分:1)

如果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}

答案 1 :(得分:1)

实际上,这取决于x是引用类型还是值类型。如果x是引用类型,则它在一个文件中的属性变异会反映在另一文件中。

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

答案 2 :(得分:0)

对require()的调用已被缓存,因此应该没有太大的区别 另外,对require()的调用会阻塞,因此,在处理它们时,Node不会运行其他任何操作。