使用 Node require() 避免循环依赖?
Avoiding circular dependencies with Node require()?
我有一个 Electron 应用程序的问题,我们会说包含在文件 index.html
和 app.js
中。 app.js
包含在带有脚本标记的 index.html
中。
在 app.js
中,我使用 var ENGINE = require("./myGameEngine/");
,然后需要不同的 classes,每个都在自己的文件中。它看起来像这样:
var myEngine = myEngine || {};
myEngine.ClassA = require('./src/ClassA');
myEngine.ClassB = require('./src/ClassB');
myEngine.ClassC = require('./src/ClassC');
module.exports = myEngine;
不幸的是,有时ClassA
,需要使用new myEngine.ClassB()
。例如,如果 ClassA
是一个实体并且具有函数 ClassA.addComponent()
,该函数可能需要使用 var component = new myEngine.ClassB()
.
尝试执行此操作时,我 运行 遇到一个错误,即 myEngine
未定义,即使 parent 需要所有这些其他文件。我不想在 ClassB
中重新要求它,因为这会造成循环依赖,但有时我 需要 ClassB
在 ClassA
中。
最令人恼火的是,以前,我没有将 app.js
包含在脚本标签中,而是需要 myEngine
和 require()
,我只需要 myEngine.js
和 app.js
来自 HTML 文件,一切正常。
我可以回到那个系统,但我喜欢将单个 JS 文件包含在我的单个 HTML 文件中的简单性,并在该 JS 文件中完成游戏引擎的所有要求,以及来自 node_modules.
的模块
有人可以向我解释这里的问题是什么以及我如何在模块中请求文件,而不必在每个文件中重新定义模块吗?
提前致谢!
编辑 1: 关于将 class 包含在其他 class 中的建议,我画了一张图来说明我为什么要这样做避免这种情况:Can of Worms
编辑 2: 虽然我可以在每个其他 class 中要求每个 class,但存在需要访问 parent 模块的变量(这是导致我写这篇文章的主要问题,因为我不想要求 child 中的 parent 和 [=75= 中的 child ]).
具体来说,考虑这个案例:
myEngine.Entity = require('./src/Entity.js');
myEngine.Component = require('./src/Component.js');
myEngine.System = require('./src/System.js');
System.js
有一个名为 update()
的方法,它看起来大致像:
update: function(){
for (let i = 0; i < myEngine.entities.length; i++) {
doSomeLogic( myEngine.entities[i] );
}
}
这在我使用脚本标签将 myEngine 包含在应用程序中时有效,而当我将 myEngine 作为 Node 模块包含时不再有效。这就是我沮丧的症结所在。
如何 require
直接从 Class 进入 Class B,而不是通过父模块。
所以在 ClassA
中只是 require('./classB')
我自己找到了答案。
通过在我的子 classes 中使用 myEngine = module.parent.exports
,我不仅可以访问其他 classes(只要 class 不使用sub class 直到另一个 class 包含在父 module.exports
中),但也可以访问更高范围的变量,如 myEngine.entities
.
我有一个 Electron 应用程序的问题,我们会说包含在文件 index.html
和 app.js
中。 app.js
包含在带有脚本标记的 index.html
中。
在 app.js
中,我使用 var ENGINE = require("./myGameEngine/");
,然后需要不同的 classes,每个都在自己的文件中。它看起来像这样:
var myEngine = myEngine || {};
myEngine.ClassA = require('./src/ClassA');
myEngine.ClassB = require('./src/ClassB');
myEngine.ClassC = require('./src/ClassC');
module.exports = myEngine;
不幸的是,有时ClassA
,需要使用new myEngine.ClassB()
。例如,如果 ClassA
是一个实体并且具有函数 ClassA.addComponent()
,该函数可能需要使用 var component = new myEngine.ClassB()
.
尝试执行此操作时,我 运行 遇到一个错误,即 myEngine
未定义,即使 parent 需要所有这些其他文件。我不想在 ClassB
中重新要求它,因为这会造成循环依赖,但有时我 需要 ClassB
在 ClassA
中。
最令人恼火的是,以前,我没有将 app.js
包含在脚本标签中,而是需要 myEngine
和 require()
,我只需要 myEngine.js
和 app.js
来自 HTML 文件,一切正常。
我可以回到那个系统,但我喜欢将单个 JS 文件包含在我的单个 HTML 文件中的简单性,并在该 JS 文件中完成游戏引擎的所有要求,以及来自 node_modules.
的模块有人可以向我解释这里的问题是什么以及我如何在模块中请求文件,而不必在每个文件中重新定义模块吗?
提前致谢!
编辑 1: 关于将 class 包含在其他 class 中的建议,我画了一张图来说明我为什么要这样做避免这种情况:Can of Worms
编辑 2: 虽然我可以在每个其他 class 中要求每个 class,但存在需要访问 parent 模块的变量(这是导致我写这篇文章的主要问题,因为我不想要求 child 中的 parent 和 [=75= 中的 child ]).
具体来说,考虑这个案例:
myEngine.Entity = require('./src/Entity.js');
myEngine.Component = require('./src/Component.js');
myEngine.System = require('./src/System.js');
System.js
有一个名为 update()
的方法,它看起来大致像:
update: function(){
for (let i = 0; i < myEngine.entities.length; i++) {
doSomeLogic( myEngine.entities[i] );
}
}
这在我使用脚本标签将 myEngine 包含在应用程序中时有效,而当我将 myEngine 作为 Node 模块包含时不再有效。这就是我沮丧的症结所在。
如何 require
直接从 Class 进入 Class B,而不是通过父模块。
所以在 ClassA
中只是 require('./classB')
我自己找到了答案。
通过在我的子 classes 中使用 myEngine = module.parent.exports
,我不仅可以访问其他 classes(只要 class 不使用sub class 直到另一个 class 包含在父 module.exports
中),但也可以访问更高范围的变量,如 myEngine.entities
.