使用 Node require() 避免循环依赖?

Avoiding circular dependencies with Node require()?

我有一个 Electron 应用程序的问题,我们会说包含在文件 index.htmlapp.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 中重新要求它,因为这会造成循环依赖,但有时我 需要 ClassBClassA 中。

最令人恼火的是,以前,我没有将 app.js 包含在脚本标签中,而是需要 myEnginerequire(),我只需要 myEngine.jsapp.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.