2012-02-02 6 views
3

クロージャコンパイラのドキュメントには、「エクスポートの代わりにエクスターナルを使用しないでください」という内容が明確に記載されています。外部宣言を使用することは非常に便利ですので、私は問題に降りてきた:ADVANCED_OPTIMIZATIONSで閉鎖コンパイラを使用する場合Closure Compilerを使用する場合、ライブラリメソッドをエクスポートする最も良い方法は何ですか?

function Lib(){ 
    //some initialization 
} 
Lib.prototype = { 
    invoke : function(str){ 
    //this function is called from outside to invoke some of Lib's events 
    } 
} 

、関数呼び出しは、ソースから削除されます。

Lib.prototype['invoke'] = Lib.prototype.invoke; 

をしかし、これは出力コードの末尾にコードの醜い平和を追加します: はプロトタイプ定義の後に行を追加する:これは、2つの方法で防ぐことができ

Lib.prototype.invoke = Lib.prototype.g; 

私は得ることができましたコンストラクタに次の行を追加して、こののRID:

外部宣言ファイルへ
this.invoke = this.invoke; 

そして、この行:

/** 
* @param {String} str 
*/ 
Lib.prototype.invoke = function(str){}; 

このように、Closure Compilerは、externsファイルで定義されているため、呼び出し元関数を出力コードから削除することはできません。 だから魔法の方がいいですか?

/** 
* @param {String} str 
* @export 
*/ 
Lib.prototype.invoke = function(str){ 
    //this function is called from outside to invoke some of Lib's events 
}; 

--generate_exportsフラグをコンパイラを呼び出す:あなたは一貫しJSDocのを使用している場合

答えて

3

、あなたは@export tagを使用することができます。

これには、Googleクローズライブラリのbase.jsを含めるか、goog.exportSymbolgoog.exportPropertyをコードベースにコピーする必要があります。

+0

これは、 '@ export'タグなしで行うことができます:' Lib.prototype ['invoke'] = function(str){}; ' –

+1

' export'タグを使ってもメソッドの名前は変更されますが、内部で使用されます。これはコンパイラの潜在能力を最大限に活用するためのよりクリーンなアプローチであり、より説明的です。 –

+0

同意しますが、 'export'タグを使って提案された方法は' goog'名前空間を必要とします。そのため、ライブラリをスタンドアロンとして使用することはできません。 –

3

個人的には、私はexternsファイル内にインターフェイスを定義し、内部クラスを実装するのが好きです。

// Externs 

/** @interface */ 
function IInvoke {}; 
IInvoke.prototype.invoke; 

/** 
* @constructor 
* @implements {IInvoke} 
*/ 
function Lib(){ 
    //some initialization 
} 
Lib.prototype = { 
    invoke : function(str){ 
    //this function is called from outside to invoke some of Lib's events 
    } 
} 

コンストラクタ自体はエクスポートしますが、インターフェイスメソッドはエクスポートしません。

関連する問題