我遇到一个问题,我有一个Electron应用程序,我们会说包含在文件index.html
和app.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.js
和myEngine
,而不是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模块包含时,它不再有效。这是我沮丧的关键。
答案 0 :(得分:0)
如何直接从ClassA require
ClassB,而不是通过父模块。
所以在ClassA
只有require('./classB')
答案 1 :(得分:0)
我找到了自己的答案。
通过在我的子类中使用myEngine = module.parent.exports
,我不仅可以访问其他类(只要该类不使用子类,直到其他类被包含在父类{{1}中}},但也访问更高范围的变量,如module.exports
。