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.Coreの前に「MYENGINE.engines.GraphicEngine」が最初に表示されます。したがって、ページを実行すると、エラーが発生します:* 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.Coreの前に「MYENGINE.engines.GraphicEngine」が最初に表示されます。

行でMYENGINE.Core

goog.require('MYENGINE.engines.GraphicEngine');

MYENGINE.Coreに依存することを示しますMYENGINE.engines.GraphicEngine。したがって、MYENGINE.engines.GraphicEngineから呼び出されたときに定義されるように、最初に表示する必要がありますMYENGINE.Core。たとえばbase.js、他のすべてのClosure Libraryソースはライブラリのブートストラップに依存しているため、Closure'sは通常ClosureBuilderによって作成されたリストの最初のソースbase.jsです。

名前の衝突に対する追加の保険のために、コンパイルされたJavaScriptを無名関数でラップしたい場合、ClosureCompilerは次のフラグを提供します。

--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 に答える