0

Closure Compilerがx.sa.xaのようなグローバル変数の名前を変更するという問題がありますが、そのグローバル変数が参照されるすべての関数で、コンパイラはH.sa.xaのような別の名前に変更します

HTML ページを表示すると、JavaScript TypeError: H.sa.xa is undefined が表示されます。

// Top-level namespace for all the code
var nam = nam || {};

(function($, nam) {

 goog.provide('nam.jsConfig');

 nam.jsConfig.cookies = {"RECENT_ITEMS": "recentitems"};

})($, nam);

(function($, nam) {
 goog.provide('nam.util.cookie');
 nam.util.cookie.readMyCookie = function () {
  var ritems_cookie = nam.util.cookie.JSONCookie.get(nam.jsConfig.cookies['RECENT_ITEMS']);
 };
})($, nam);


Closure Compiled Code:
x.sa = {};
x.sa.xa = {RECENT_ITEMS:"recentitems"};

H.a = {};
H.a.cookie = {};
H.a.Tm = function() {
  var a = H.a.cookie.ja.get(H.sa.xa.RECENT_ITEMS);
};

何らかの理由で、Closure Compiler がx .sa.xa.RECENT_ITEMSではなくH .sa.xa.RECENT_ITEMS を参照しています。

コンパイラがこれを行っている理由は何ですか?

4

3 に答える 3

0

あなたが何をしているのか推測させてください: ADVANCED モードで各ファイルを個別にコンパイルしています。もしそうなら、これは ADVANCED モードの仕組みではありません。高度なモードでは、コンパイル ジョブ間で変数とプロパティを共有する場合は、それらをエクスポートする必要があります。

于 2013-03-25T16:52:29.843 に答える
0

あなたの質問を解釈できる唯一の方法は、次の 2 つのいずれかが起こっているということです。

  1. Closure Compiler の難読化および最小化コードに問題がある、または
  2. 表示されているエラーは、コンパイルされた変数を直接参照している Closure Compiler によってコンパイルされたコードの外部で実行されている JavaScript からのものです。

前者の場合は、変数のずれを引き起こしているケースを切り分けて、Google にバグとして送信する必要があります。Closure Compiler を使用している私たち全員が、大いに感謝しています。

代わりに、私が推測するように後者である場合、コンパイルされたコードの外部で使用したいグローバル変数をエクスポートしていない可能性が最も高いです。これを行う最も簡単な方法は、関数を呼び出しgoog.exportSymbol()て、Closure Compiler によってアセンブルされたコードの外部でグローバル変数を使用できるようにすることです。たとえば、sandwich.meat.Hamコンパイルされていないコードからコンパイル モードでプロパティにアクセスする場合は、次のようにします。

goog.exportSymbol('sandwich.meat.Ham', sandwich.meat.Ham);

次に、エクスポートされた変数を参照するコンパイル済みコードの外部に存在するコードをいくつか持つことができます。

function() {
    var meat = new sandwich.meat.Ham();
}
于 2013-03-25T00:23:03.123 に答える
0

あなたが提供したコード例には、もっと重大な問題があります。一人分

goog.provide('nam.util.cookie');

に変わった

H.a = {};
H.a.cookie = {};

さらに後でこのコード:

nam.util.cookie.readMyCookie = function () {...

に変わった

H.a.Tm = function() {...

どこにあると予想されるか

H.a.cookie.Tm = function() {...

さらに、namコンパイルされていないコードの両方の半分のベース名前空間として使用し、それぞれ別xの名前空間と名前空間に変換されるという事実Hは、さらに多くのことが関与していることを示唆しています。いくつかの提案:

  • モジュールパターンを使用する場合は、provide/require ステートメントをモジュールの外に置きます。
  • var nam = nam || {}provide がすでにこれを行っているため、名前空間を手動で作成しないでください。
  • nam.jsConfig他の人が述べたように、とを含む両方のファイルをnam.util.cookie単一のコンパイルに含める必要があります
  • 依存関係の要件が満たされていることを確認するためgoog.require('nam.jsConfig')に、ファイルに があることを確認してくださいnam.util.cookie.readMyCookie

FWIW、このような相互依存関係を含む、何百ものファイルを含む大規模なアプリケーションでクロージャーを使用しています。問題はツールにあるのではなく、ツールの使用方法にあるのではないかと私は強く疑っています。

于 2013-04-06T09:00:51.217 に答える