当我在ClassB中导入ClassA,然后在ClassB中导入ClassA时,导入的ClassA是一个空对象。为了演示,我有以下3个文件:
ClassA.js
const ClassB = require('./ClassB');
class ClassA {
static test() {
ClassB.test();
}
}
module.exports = ClassA;
ClassB.js
const ClassA = require('./ClassA');
class ClassB {
static test() {
console.log('ClassA.test', ClassA.test);
}
}
module.exports = ClassB;
index.js
const ClassA = require('./ClassA');
ClassA.test();
当我运行node index.js
时,我希望在控制台中看到ClassA.test function
,但是它将输出ClassA.test undefined
。是一些未记录的东西,还是一个错误?
答案 0 :(得分:1)
您具有循环依赖关系。解决方案是让第三类同时需要这两个类,并使用ClassA
中ClassB
中的任何代码,反之亦然。
const ClassA = require('./ClassA');
const ClassB = require('./ClassB');
class ClassC {
static test() {
ClassA.test();
ClassB.test();
}
}
当我运行节点index.js时,我希望在其中看到ClassA.test函数 控制台,但是它输出ClassA.test未定义。有吗 没有记录的东西,还是一个错误?
不,这不是bug,也没有记录在案。
您可以在此处详细了解其处理方式:https://nodejs.org/api/modules.html#modules_cycles
您还可以进行延迟加载,并将解决此特定情况下的问题。但是在大多数情况下,循环引用是编写不良代码的征兆。
class ClassB {
static test() {
const ClassA = require('./ClassA')
console.log('ClassA.test', ClassA.test);
}
}
module.exports = ClassB;
答案 1 :(得分:1)
您具有循环依赖关系,因此Node无法确定哪个模块的顶层代码应首先运行-一个模块需要首先运行其顶层代码,以便应该导出某些内容,以便其他模块可以通过require
导入它。但是,如果两者都依赖于另一个,则第一个运行的将require
调用另一个对undefined
的解析。
最好的解决方案是对其进行重构,以避免循环依赖。