自3天以来,我因Google关闭而遇到了一个问题,因为依存关系是按错误的顺序进行的,因此得到了以下信息:
main.js
(function () {
goog.provide('MYENGINE.Core');
goog.require('MYENGINE.engines.GraphicEngine');
goog.require('MYENGINE.engines.PhysicEngine');
goog.require('MYENGINE.engines.AudioEngine');
goog.require('MYENGINE.engines.GameEngine');
/*********************************
* @constructor
*
**********************************/
ENGINE.Core = function()
{
};
})();
和此代码(具有正确的名称):
(function () {
goog.provide('MYENGINE.engines.GraphicEngine');
/*********************************
* @constructor
*
**********************************/
MYENGINE.engines.GraphicEngine = function()
{
};
})();
我不知道为什么,但是当我对此进行编译时,“ MYENGINE.engines.GraphicEngine”首先出现在MYENGINE.Core之前。
因此,当我运行页面时,出现了错误:*未捕获的ReferenceError:未定义MYENGINE *
我使用以下代码来编译项目:
../extlib/closure/closure/bin/build/closurebuilder.py \
--root=../extlib/closure/ \
--root=../src \
--namespace="MYENGINE.Core" \
--output_mode=compiled \
--compiler_jar=compiler.jar \
> MYENGINE_min.js
在我的“ MYENGINE_min.js”中,我可以在核心名称空间或初始名称空间(MYENGINE)之前找到GraphicEngine的创建内容,我是否忘了做某事!?
非常感谢你的帮助 !
最佳答案
闭包的设计使您无需将每个模块都包装在匿名函数中。
如果删除匿名函数包装器,则错误将消失。例如,main.js变为:
goog.provide('MYENGINE.Core');
goog.require('MYENGINE.engines.GraphicEngine');
goog.require('MYENGINE.engines.PhysicEngine');
goog.require('MYENGINE.engines.AudioEngine');
goog.require('MYENGINE.engines.GameEngine');
/**
* @constructor
*/
MYENGINE.Core = function()
{
};
您还问:
我不知道为什么,但是当我编译它时,“ MYENGINE.engines.GraphicEngine”首先出现在MYENGINE.Core之前。
在
MYENGINE.Core
行中:goog.require('MYENGINE.engines.GraphicEngine');
表示
MYENGINE.Core
取决于MYENGINE.engines.GraphicEngine
。因此,必须首先出现MYENGINE.engines.GraphicEngine
,以便在从MYENGINE.Core
进行调用时对其进行定义。例如,Closure的base.js
通常是Closure Builder生成的清单中的第一个源,因为所有其他Closure库源均依赖base.js
来引导库。如果您想将编译后的JavaScript包装在匿名函数中,以防止名称冲突,请使用Closure Compiler提供以下标志:
--output_wrapper Interpolate output into this string at the place denoted by the marker token %output%.
Using Closure Builder, the output wrapper would be specified on the command line as follows:
--compiler_flags="--output_wrapper=(function(){%output%})();"
此外,将“编译器”警告级别设置为“详细”将有助于在编译时捕获其他错误:
--compiler_flags="--warning_level=VERBOSE"
新的构建命令将是:
../extlib/closure/closure/bin/build/closurebuilder.py \
--root = .. / extlib / closure / \
--root = .. / src \
--namespace =“ MYENGINE.Core” \
--output_mode =已编译\
--compiler_jar = compiler.jar \
--compiler_flags =“-output_wrapper =(function(){%output%})();” \
--compiler_flags =“-warning_level = VERBOSE” \
> MYENGINE_min.js