1

GoogleClosureコンパイラがコード内のシンボルを最適化する方法が大好きです。ただし、構成オブジェクトをパラメーターとして受け取るパブリックのエクスポートされた関数を定義する良い方法は見つかりませんでした。このコードスニペットについて考えてみましょう。

goog.provide('foo');
goog.require('goog.dom');

/** @typedef {{
 *              id : string,
 *              clazz : string
 *           }}
 */
foo.config;

/**
 * Does some neat stuff
 * @param {foo.config} config
 */    
foo.myFoo = function(config) {
    var el = goog.dom.getElement(config.id);
    goog.dom.classes.add(el, config.clazz);
} 
goog.exportSymbol('foo.myFoo', foo.myFoo);

ここで、このスクリプトをロードし、次のようにmyFooを呼び出したいとします。

<script type="text/javascript">
foo.myFoo({
    id: 'unique-id',
    clazz: 'pretty'
});
</script>

コンパイルすると、idプロパティとclazzプロパティが圧縮されているため、これは失敗します。

Google Closureコンパイラを使用して構成オブジェクトを実装およびエクスポートするための洗練された方法を知っている人はいますか?

4

2 に答える 2

1

私の提案は、以下のように、単純にパラメータに注釈を付け{Object}、キーを引用することです。

foo.myFoo({
    'id': 'unique-id',
    'clazz': 'pretty'
});

...

/**
 * Does some neat stuff
 * @param {Object} config
 */    
foo.myFoo = function(config) {
    var el = goog.dom.getElement(config['id']);
    goog.dom.classes.add(el, config['clazz']);
} 
于 2010-10-28T00:43:30.327 に答える
1

マングルされたプロパティ名と生のプロパティ名の競合について

次のいずれかを行う必要があります。

  • プロパティ名を「extern」します(名前が変更されないようにするため)
  • プロパティにアクセスするには「括弧表記」を使用します

構成オブジェクトについて

Closure Compiler docs によると、現在それを行うことはできません。パラメータをオブジェクトとしてマークする必要があります。

タイプを定義することはできますが、タイプにはすべてのプロパティが存在する必要があるため役に立ちませんが、構成オブジェクトにはいくつかのパラメーターしか設定できません。

Closure Compiler のドキュメントでは、パラメーターを Object としてマークすることを推奨していますが、フィールドについてはコメントで説明しています。

于 2011-03-10T13:23:30.393 に答える