自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

09-20 10:09