为什么在NodeJS中使用“ require”时会有如此奇怪的行为?

时间:2019-12-23 03:23:50

标签: node.js

当我在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。是一些未记录的东西,还是一个错误?

2 个答案:

答案 0 :(得分:1)

您具有循环依赖关系。解决方案是让第三类同时需要这两个类,并使用ClassAClassB中的任何代码,反之亦然。

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的解析。

最好的解决方案是对其进行重构,以避免循环依赖。