每次require是否都会创建一个node.js模块实例?

5

我正在尝试解决一个 node.js 应用程序中的一个错误。

在名为 mmm 的模块中,我有一个本地变量 (未导出) 称为 xxx,它被设置为 false。有一个导出函数叫做 enableXXX(),它将该变量设置为 true。另一个模块 nnn 要求使用 mmm 并调用 enableXXX()

其他模块要求使用 mmm,但似乎没有执行对 enableXXX() 的调用。它的行为就像 xxx 仍然是 false

这是不是每个 require 都创建了一个单独的模块实例?

更新

事实证明这是一个 require 中的错误大写字母:

// Module A
var XXX = require("./myDir/xxx.js");
...

// Module B
var XXX = require("./mydir/xxx.js");
...

2
是的,require会创建一个新实例和一个新的干净词法局部作用域。 - dandavis
如果您发现有代码未能执行,就应该进行调试。设置断点并查看它们是否已执行。如果无法设置断点,请在某些代码行后输出文本,并查找哪些行被执行了,哪些没有被执行。 - keiv.fly
@dandavis 好的,谢谢。如果您创建了一个解决方案,我会批准它。 - Jérôme Verstrynge
@dandavis 高质量的挑衅 instanceof 高质量 - Winchestro
2个回答

11

不,它不能。我们来做一个实验:

mmm.js:

var xxx = false;

exports.enableXXX = function() {
    xxx = true;
}

exports.isEnabled = function() {
    return xxx;
}

nnn.js:

require('./mmm').enableXXX();

main.js:

require('./nnn');

console.log('The result is: ' + require('./mmm').isEnabled());

现在让我们运行main.js

$ node main.js
The result is: true

这里有一段来自官方文档的解释:

  • 模块在第一次加载后会被缓存。这意味着(除其他事项外),如果 require('foo') 解析到相同的文件,则 每次调用都将返回完全相同的对象

1

这绝对是一个模块缓存陷阱问题。 - Jérôme Verstrynge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接