2017-03-13 70 views
1

我有一个问题,我有一个电子应用程序,我们会说包含在文件index.htmlapp.jsapp.js包含在带脚本标记的index.html中。避免与Node require()的循环依赖关系?

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.js与脚本标签和需要myEnginerequire(),我只是需要双方myEngine.jsapp.js从HTML文件中,所有工作得很好。

我可以回到那个系统,但我喜欢简单的包括一个单独的JS文件去处理我的单个HTML文件,并且完成JS文件中所有需要的游戏引擎以及来自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模块包含时不再有效。这是我沮丧的症结所在。

回答

0

我发现我自己的答案。

通过在我的子类中使用myEngine = module.parent.exports,我不仅可以访问其他类(只要该类在父类的module.exports中包含其他类之前不使用子类),还可以访问更高范围的变量,如myEngine.entities

0

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

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

+0

那么简短的回答是,我觉得在所有事情中都要求一切都很难看。老实说,在这一点上要干净一点 长的回答是,这将导致问题在不同范围内调用其中一个函数,尽管因为它将依赖于子模块被调用的任何时候文件,而不是它被称为“全球”(即使这不是真正的全球)。 此外,仍然没有解释为什么当游戏引擎被包含在脚本标签中而不是在'app.js'中被要求使用时。 –

+0

require是一个nodejs函数。除非您使用构建工具(例如browserify,webpack)来编译浏览器消耗的模块化代码,否则浏览器无法理解需要什么。这可以解释为什么它在通过脚本标记添加到全局范围时起作用,但当app.js需要时则不能。 –

+0

我不明白它是如何不理解require()函数的浏览器的问题......我确实知道脚本标记将它放在全局范围内。 你能推荐一个解决方案吗?我已经做了一些说明,为什么我想避免这种情况。 [Can of Worms](http://i.imgur.com/ymbxXm1.jpg) 我已经搜索过类似web worker的功能,只需在文件中的某个位置添加一些外部代码即可。虽然我找不到'require()'以外的任何东西。 –