NodeJS:早期要求无法访问对象字段

NodeJS: Early require doesn't have access to object field

我在访问位于文件顶部 required/imported 的对象中的字段时遇到问题,但是当稍后在代码中再次导入该对象时,该字段是可访问的。


我举了一个小例子来说明我的意思:[Execute code on CodingGround]

main.js:

var ClassA = require('./ClassA');

ClassA.init();

ClassA.js:

var ClassB = require('./ClassB');

var ClassA = function() {};

ClassA.init = function() {
    // Define a variable in ClassA
    this.myVar = 'My Value';

    // Create an instance of ClassB, and try to print the defined variable
    var myClass = new ClassB();
    myClass.printMyVar();
};

module.exports = ClassA;

ClassB.js:

var ClassA = require('./ClassA');

var ClassB = function() {};

ClassB.prototype.printMyVar = function() {
    // Print the variable (not working)
    console.log('My Var: ' + ClassA.myVar);

    // Require ClassA again
    ClassA = require('./ClassA');

    // Print the variable again (working)
    console.log('My Var (again): ' + ClassA.myVar);
};

module.exports = ClassB;

执行 main.js 时得到以下输出:

My Var: undefined
My Var (again): My Value

为什么第一行显示变量未定义,为什么在requiring/importing再次对象后正确显示变量?

这是循环依赖引起的吗?如果是的话,以后如何避免这个问题?

这是描述的情况in the NodeJS modules "cycle" topic。如果存在循环依赖关系,解决方案似乎是增加 exports 对象而不是替换 它。

这是他们的例子,修改后显示当 b 检查 a.done 之后 ,它看到正确的值:

a.js:

console.log('a starting');
exports.done = false;
const b = require('./b.js');
console.log('in a, b.done = %j', b.done);
exports.done = true;
console.log('a done');

b.js:

console.log('b starting');
exports.done = false;
const a = require('./a.js');
console.log('in b, a.done = %j', a.done);
exports.done = true;
exports.check = function() {
    console.log('in b\'s check function, a.done = %j', a.done);
};
console.log('b done');

main.js:

console.log('main starting');
const a = require('./a.js');
const b = require('./b.js');
console.log('in main, a.done=%j, b.done=%j', a.done, b.done);
b.check();

输出为:

main starting
a starting
b starting
in b, a.done = false
b done
in a, b.done = true
a done
in main, a.done=true, b.done=true
in b's check function, a.done = true