2012-02-03 11 views
1

私はモジュラーコンポーネントフレームワークに取り組んでおり、テスト環境とプロダクションのコードのニーズが異なります。各コンポーネントには独自のjsファイルがあり、これらは実際に使用するために一緒にコンパイルされていますが、開発環境には別に残されています。Googleクロージャコンパイラでjavascriptを変更することはできますか?

私は、呼び出しスタックを壊さないように、初期化のさまざまな段階でエラーをトラップしたいと考えています。私の開発(非圧縮のjavascript)では、エラーをトラップしたくないので、改行がどこで発生するかを見つけるために行番号などをすばやく取得できます。クロージャコンパイラを使用してjavascriptファイルを操作する方法はありますか(これは、コメントオープナーなどのフラグ付きの行を削除するなど)、これを行うことができますか?

例えば

proto.instantiateChildFromDescriptor = function(childObj, callback, customDiv){ 
/*ProductionErrorTrap 
    try{ 
/**/ 
    //code for instantiating a module 
/*ProductionErrorTrap 
    }catch(e){ 
     console.log("problem instantiating child in " + this.getName()); 
     console.error(e); 
    } 
/**/ 
} 

/*ProductionErrorTrap*//*ProductionErrorTrapがうまく働くだろう交換(その二コメントブロックの上に私の星を削除して、彼らはそこにある)

私がこれを行うことはできませんファイルを見つけて置き換えてください。なぜなら、githubを混乱させるからです。私は、ファイルの新しいコピーを作成し、それらのファイルを検索して置き換えてコンパイルすることができると思いますが、クロージャーコンパイラですべて行うことができればいいと思います。

ありがとうございました

+0

あなたは基本的にifDefを探していますよね? – hugomg

+0

そのように見える(この文脈でそれを見ていなければならなかった)ので、ここでそれを実装する方法/について少し不明瞭です。 – Shane

+0

2番目の考えでは、私はそれが動作するとは思わない...理由は、彼らがコードブロックを操作するので、そのように動作しないtry catchステートメントを作成しているということです。 – Shane

答えて

1

私はifdefsをエミュレートするためにコメントを照合してコンパイルされた結果をばかげていると思うと、かなり不自然です。

あなたが実際にこのような何かを行うことができます:

debugTry(function() { 
    alert('This is code that might cause an error'); 
},function(e) { 
    alert('Whoops! Caught error '+e); 
}); 

を次にあなたがデバッグ中:

function debugTry(test,handle) { 
    try { 
     test(); 
    } catch(e) { 
     handle(e); 
    } 
} 

と生産には:

function debugTry(test,handle) { 
    test(); 
} 

閉鎖コンパイラはかなりスマートです。ご覧のように、不必要なコードが検出され、除去さ

alert("This is code that might cause an error"); 

:には、コンパイル第debugTryと

try{alert("This is code that might cause an error")} 
catch(a){alert("Whoops! Caught error "+a)}; 

:最初debugTryでの例はにコンパイル。

もちろん、tryブロックを条件付きで指定しなかった方が簡単です。それ以外のコードの構造を変更しない条件付きで記述すると、次のようになります。

/** @const */ var debug = false; 

if(debug) { 
    alert('Yay for debugging!'); 
} 

警告がコンパイルされます。

+0

Brilliant、これはGoogleの電話帳での一元的なエラー報告に結びつきますアプリも同様です。 – Shane

+0

私は同じような何かについて考えている: if(debug){ tryFunction = debugTry: } else { tryFunction = justDoIt; } これらの2つの機能は、上記のdebugTryの2つのバージョンに対応しています。それが私たちのためにうまくいくかどうかを報告します。 – Shane

0

スティーブンチョンのコメントが最良のアプローチであるようです。この問題を持つ他の人のために、この質問に対する答えとして彼のコメントを追加する。私はjavascriptの私は検索を実行し、圧縮されたファイルに置き換え、改行を削除し、ProductionErrorTrapでProductionErrorTrapを置き換えるを圧縮した後、自分のコード

proto.updateProperties = function(propsObj){ 
/** @preserve ProductionErrorTrap try{ /**/ 
    //do stuff here 
/** @preserve ProductionErrorTrap }catch(e){console.log("problem updating properties in " + this.getName());console.error(e);}/**/ 
} 

に次のように入力された* /、すべてせることなく、正常に動作するようですリポジトリの混乱。

ありがとうスティーブン!

+1

ところで、これらの改行は理由のためにあります。 [Closure Compiler FAQ:コンパイルされたスクリプトにランダム改行があるのはなぜですか?](https://developers.google.com/closure/compiler/faq#linefeeds) –

1

アドバンストモードのコンパイラフラグを使用します。例えば
https://developers.google.com/closure/compiler/docs/js-for-compiler

@define {Type} description 

:から

/** @define {boolean} */ 
var ENABLE_DEBUG = true; 

/** @define {boolean} */ 
goog.userAgent.ASSUME_IE = false; 

は、コンパイル時にコンパイラによってオーバーライドすることができる定数です。上記の例では、フラグ--define='ENABLE_DEBUG=false'をコンパイラに渡して、ENABLE_DEBUGの値をfalseに変更することができます。

関連する問題