2

自从 Google 关闭 3 天以来,我遇到了一个问题,因为依赖项的顺序错误,我得到了这个:

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 之前。所以,当我运行页面时,我得到了错误:* Uncaught ReferenceError: MYENGINE is not defined *

我使用此代码来编译项目:

../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 的创建,我是不是忘了做点什么!?

非常感谢你的帮助 !

4

2 回答 2

1

闭包的设计使得您不需要将每个模块包装在匿名函数中。如果您删除匿名函数包装器,您的错误应该会消失。例如,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'sbase.js通常是 Closure Builder 生成的清单中的第一个源,因为所有其他 Closure Library 源都依赖于base.js引导该库。

如果您想将编译后的 JavaScript 包装在匿名函数中以额外防止名称冲突,则 Closure Compiler 提供以下标志:

--output_wrapper 将输出插入到该字符串中指定的位置
                    通过标记标记 %output%。

使用Closure Builder,将在命令行上指定输出包装器,如下所示:

--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
于 2012-06-06T23:15:41.223 回答
0

你可以使用 goog.scope

goog.scope(function(){
    //code here
});

于 2015-07-27T06:55:58.037 回答