Node.js 为什么使用“时会有如此奇怪的行为?”;要求;在NodeJS?
当我在ClassB中导入ClassA,然后在ClassB中导入ClassA时,导入的ClassA是一个空对象。为了演示,我有以下3个文件: ClassA.jsNode.js 为什么使用“时会有如此奇怪的行为?”;要求;在NodeJS?,node.js,Node.js,当我在ClassB中导入ClassA,然后在ClassB中导入ClassA时,导入的ClassA是一个空对象。为了演示,我有以下3个文件: ClassA.js const ClassB=require('./ClassB'); 甲级{ 静态测试(){ ClassB.test(); } } module.exports=ClassA; ClassB.js const ClassA=require('./ClassA'); B类{ 静态测试(){ 日志('ClassA.test',ClassA.t
const ClassB=require('./ClassB');
甲级{
静态测试(){
ClassB.test();
}
}
module.exports=ClassA;
ClassB.js
const ClassA=require('./ClassA');
B类{
静态测试(){
日志('ClassA.test',ClassA.test);
}
}
module.exports=ClassB;
index.js
const ClassA=require('./ClassA');
ClassA.test();
当我运行
node index.js
时,我希望在控制台中看到ClassA.test函数
,但它会输出ClassA.test undefined
。它是一些未记录的东西,还是一个bug?您有一个循环依赖关系。解决方案是使用第三个类,它将同时需要这两个类,并使用ClassA
中ClassB
中的任何代码,反之亦然
const ClassA = require('./ClassA');
const ClassB = require('./ClassB');
class ClassC {
static test() {
ClassA.test();
ClassB.test();
}
}
当我运行node index.js时,我希望在中看到ClassA.test函数
控制台,但它输出ClassA.test undefined。是一些吗
没有记录的东西,还是一个bug
不,这不是一个bug,也不是没有记录的
您可以在此处阅读有关如何处理的更多信息:
您还可以执行延迟加载,并将解决此特定情况下的问题。但在大多数情况下,循环引用是代码编写糟糕的症状
class ClassB {
static test() {
const ClassA = require('./ClassA')
console.log('ClassA.test', ClassA.test);
}
}
module.exports = ClassB;
你有一个循环依赖。解决方案是使用第三个类,它将同时需要这两个类,并使用
ClassA
中ClassB
中的任何代码,反之亦然
const ClassA = require('./ClassA');
const ClassB = require('./ClassB');
class ClassC {
static test() {
ClassA.test();
ClassB.test();
}
}
当我运行node index.js时,我希望在中看到ClassA.test函数
控制台,但它输出ClassA.test undefined。是一些吗
没有记录的东西,还是一个bug
不,这不是一个bug,也不是没有记录的
您可以在此处阅读有关如何处理的更多信息:
您还可以执行延迟加载,并将解决此特定情况下的问题。但在大多数情况下,循环引用是代码编写糟糕的症状
class ClassB {
static test() {
const ClassA = require('./ClassA')
console.log('ClassA.test', ClassA.test);
}
}
module.exports = ClassB;
您有一个循环依赖项,因此Node无法确定应该首先运行哪个模块的顶级代码-其中一个模块需要首先运行其顶级代码,以便导出某些内容,以便另一个模块可以通过
require
导入它。但是如果两者都依赖于另一个,那么运行的第一个将有其require
调用,以解析另一个未定义的
最好的解决方案是重构它以避免循环依赖。您有一个循环依赖,因此,节点无法确定哪个模块的顶级代码应该首先运行-其中一个模块需要先运行其顶级代码,以便导出某些内容,以便另一个模块可以通过require
导入。但是如果两者都依赖于另一个,那么运行的第一个将有其require
调用,以解析另一个未定义的
最好的解决方案是重构它以避免循环依赖。是的,在test()
方法中使用const ClassA=require('./ClassA')
,这正是我不久前修复它的方法。我只是很感兴趣,它为什么会发生。是的,当你第一次遇到错误时有点困惑,但这是有道理的:)。很高兴能帮上忙。我刚刚意识到为什么我要问它是没有文档记录的还是一个bug:NodeJS通常非常慷慨地显示警告/错误,但当循环依赖发生时,它保持沉默。它只是提供了一个损坏的对象,没有说任何有点意外的行为。我同意这一点,警告肯定是积极的。是的,在test()
方法中使用const ClassA=require('./ClassA')
,这正是我不久前修复它的方式。我只是很感兴趣,它为什么会发生。是的,当你第一次遇到错误时有点困惑,但这是有道理的:)。很高兴能帮上忙。我刚刚意识到为什么我要问它是没有文档记录的还是一个bug:NodeJS通常非常慷慨地显示警告/错误,但当循环依赖发生时,它保持沉默。它只是提供了一个损坏的对象,没有说任何有点意外的行为。我同意这一点,警告肯定是积极的。