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

时间:2017-03-13 23:29:21

标签: javascript node.js module game-engine electron

我遇到一个问题,我有一个Electron应用程序,我们会说包含在文件index.htmlapp.js中。 app.js中包含index.html和脚本标记。

app.js内,我使用var ENGINE = require("./myGameEngine/");,然后需要不同的类,每个类都在自己的文件中。它看起来像这样:

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未定义的错误,即使它是需要所有其他文件的父级。我不想在ClassB中要求它,因为这将创建循环依赖关系,但有时我 ClassB内需要 ClassA

以前最令人愤怒的是,我只需要app.jsmyEngine,而不是require()包含脚本标记,而myEngine.js需要app.js HTML文件,一切正常。

我可以回到那个系统,但我喜欢简单地将单个JS文件包含在我的单个HTML文件中,并且在该文件中执行游戏引擎的所有要求,以及来自node_modules的模块。

有人可以向我解释这里的问题是什么以及如何在模块中需要文件,而不必在每个文件中重新定义模块?

提前谢谢!

编辑1:关于将类包含在其他类中的建议,我创建了一个关于为什么要避免这种情况的图:Can of Worms

编辑2:虽然我可以要求每个其他类中的每个类,但是存在需要访问父模块变量的问题(这是导致我写这个的主要问题,因为我不想要求孩子的父母和父母的孩子。

具体而言,请考虑这种情况:

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模块包含时,它不再有效。这是我沮丧的关键。

2 个答案:

答案 0 :(得分:0)

如何直接从ClassA require ClassB,而不是通过父模块。

所以在ClassA只有require('./classB')

答案 1 :(得分:0)

我找到了自己的答案。

通过在我的子类中使用myEngine = module.parent.exports,我不仅可以访问其他类(只要该类不使用子类,直到其他类被包含在父类{{1}中}},但也访问更高范围的变量,如module.exports