2012-02-28 13 views
3

内部関数の名前を変更しないようClosure Compilerに指示するにはどうすればよいですか?例えば、与えられたこのコード:クローズコンパイラに、SIMPLE_OPTIMIZATIONSを使用して内部関数の名前を変更しないように指示するにはどうすればよいですか?

function aMeaninglessName() { 
    function someMeaningfulName() { 
    } 

    return someMeaningfulName; 
} 

...私は外側の関数(私は積極的にそれは、スペースを節約するためにしたい)に名前を変更閉鎖で元気ですが、私はそのよう(関数名someMeaningfulNameが放置たいコールスタックに表示される名前は "someMeaningfulName"であり、 "a"などではありません。これは、コードを呼び出すコードが、コード内の名前ではなく、ファクトリ関数によって返された参照を介して行われるという事実にもかかわらずです。たとえば、これは純粋にデバッグサポート用です。私は関数が実際の名前ということにしたい

注、例えばこれはthis other questionの重複ではありませんので、匿名でその名前を使用して、いくつかのプロパティに割り当てられてはなりません。

このややわかりにくい使用例は、externs機能またはexports機能のいずれによってもカバーされていないようです。 (私はそれが捨てることができるannotationがあることを望んでいた。)しかし、私はクローズコンパイラの教祖ではない、あなたの何人かが望んでいる。当然、それを行う方法がない場合、それは容認できる答えです。


(ユースケースは、私はSIMPLE_OPTIMIZATIONSと閉鎖によって事前に圧縮されていますライブラリのバージョンを提供したい。それへの呼び出しに応じて機能を作成するライブラリである、誰かがそのコピーを使用している場合のライブラリを独自の非圧縮コードでデバッガ[または他の同様の操作]で関数にシングルステップ実行すると、意味のある名前が表示されます。evalで回避するか、手動で圧縮結果を編集します[in事実、文脈は十分にユニークで、私はsedスクリプトをそれに投げることができます]しかし、それは扱いにくく、率直に言って私たちを「面倒な価値がない」領域にして、単純でメンテナンスの少ない方法を探しています)。

答えて

1

これを行う簡単な方法はありません。あなたのメソッドが "ローカル" externsであることを示すために、CodingConventionクラスのカスタムサブクラスを作成する必要があります(Prototypeライブラリを処理するためのサポートが追加されています)。 InlineVariables、InlineFunctions、またはRemoveUsedVariablesは引き続き名前の削除を試みる可能性があり、また修正する必要があります。

もう1つの方法は、ソーストレースを使用してスタックトレースを元のソースに再マップする方法です。

+0

私はそれがそれの価値があると思った場合、私は自分のローカルカスタマイズされたバージョンのコンパイラを使用して、デフォルトのコーディング規約を包むための 'CodingConventions.Proxy'を持ち、override ... what、' isPrivateそのメンバーに 'false'を返すようにするには? –

+0

isExported(String name、boolean local)は、特に "local"がtrueの場合に、対象となるメソッドです。 – John

+0

ありがとうございます。だから、フラグを追加するために 'CommandLineRunner'をハックする必要がありますか?そして、物事の見た目からは、デフォルトではなくClosureCodingConventionをラップまたは拡張して、普通に特別なビットを加えたのと同じ動作を得たいと思うかもしれません。それはあまりにも悪くないですが、クロージャーはダウンロードしてビルドするのに手間がかかりません。私が本当に野心的だと感じたら、代わりに注釈を追加してパッチとして提供するかもしれません。 –

0

https://developers.google.com/closure/compiler/docs/api-tutorial3#export

つのオプション基本的には次のセクション、使用目的[「functionNameを」] = obj.functionNameまたはより良い方法 使用exportSymbolとexportProperty GOOGオブジェクトの両方を読んで、ここではドキュメントのリンクです以下のためにその

http://closure-library.googlecode.com/svn/docs/closure_goog_base.js.html

- 編集 ああ、私は今、私の最初の答えはあなたのためにそれほど大きくありません参照してください。コンパイラには興味深いフラグがいくつかあります。DEBUGはコンパイラに変数を渡すことができます。コンパイラにはデバッグアノテーションをロギングでドロップするか、シンプルモードを使用しているので何もしない文字列をドロップできます。

したがって、クロージャを使用している場合は、依存関係が解決されたばかりのページである開発版に対してデバッグすることができます。

if(DEBUG){ 
    logger.info('pack.age.info.prototype.func'); 
} 
+0

また、以前はFirebugプラグインが使用されていましたが、現在は使用できません。クロージャを一般的に使用しているのであれば、開発バージョンをビルドするだけです。これは依存関係を解決します(クロームデバッガでは、Firebugのようにオブジェクトの代わりにクラスパス全体を表示します)それぞれの関数メンバで – lennel

関連する問題