2012-05-01 3 views
14

私は使用しているjavascriptソースでGoogleクロージャコンパイラを使用したいと思います。 開発モードでは、機能を多くのファイルに分割する傾向がありますが、プロダクションではそれらをモジュールに結合したいと考えています。GoogleのClosure Compilerを使用してJavaScriptをモジュールに分割するにはどうすればよいですか?

コンパイラを呼び出すときに、コンパイルに含めるファイルのリストを与えることができますが、コンパイラがファイルリストの順序を保存していないことが出力されます。

これを検索したところ、異なるjsファイル間の依存関係を制御するために、goog.provide/good.requireを使用できることがわかりました。 、JSコンパイルされたファイルへ

var mainFile = {}; 

を:

goog.provide("mainFile") 

これを追加します。それに 問題は、それが私は、たとえば、必要とするか、またはしたくない、私のjsのコードを追加することです私が望まないもの。 私はGoogleクロージャライブラリをまったく使用していません。使用したいのはコンパイラだけです。

私は必要がないより多くの "閉鎖ライブラリ"機能を含まずにファイルの順序をコンパイラに伝える方法はありますか? 私はもちろん、すべてのファイルを最初に取り出し、それらを1つにまとめてコンパイラの入力にするツールを自分で作成することができますが、コンパイラ自体で行うことができれば、それを無効にすることをお勧めします。


編集

の目標は、このスレッドで答えのようなモジュールを生成することができることです。Using the --module option in Closure Compiler to create multiple output files

そして私はそれにそこに行くどのファイルを制御する機能を追加したいですモジュールの順序を制御することができます。 今のところ私はワイルドカードを使用していませんが、将来的にはそうする予定です(可能な場合)。

は単に「猫は... file2.js> combined.js & &コンパイルをfile1.js」結構ですが、私たちの場合、それはもう少し複雑だと我々はそれを行うプログラム/スクリプトを記述する必要がありますいくつかの論理に基づいています。 ファイルの順番をコンパイラに何とか伝えることができれば、そのようなプログラムを実装する時間を節約できるかもしれません。

ありがとうございました。

+1

いかが '猫ファイル1ファイル2>一時&&コンパイル-js temp'? – georg

+0

ワイルドカード(* .js)を使用しているか、コンパイラを呼び出すときに各ファイルを順番に記述していますか? – GillesC

+0

コメントのために大きすぎるので私は自分の質問を編集しました。ありがとう。 –

答えて

28

モジュールを作成するClosure-compilerの機能は、入力ファイルを個別の出力ファイルに分離する強力なツールを提供します。必要な機能に応じて異なるモジュールを異なる時間にロードできるように設計されています。モジュールに関する複数のコンパイラフラグがあります。

--moduleフラグを使用するたびに、出力ファイルとその依存関係が記述されます。

--js inputfile.js 
--module name:num_files:dependency 

結果出力ファイルはname.jsなり、先行--jsフラグ(S)で指定されたファイルを含む:各モジュールのフラグは、次の構文に従います。

依存関係オプションは、親モジュールの内容を指定します。モジュールオプションは、有効な依存関係ツリーを記述する必要があります(ベースモジュールが必要です)。

は、ここに例を示します。この場合

--js commonfunctions.js 
--module common:1 
--js page1functions.js 
--js page1events.js 
--module page1:2:common 
--js page2function.js 
--module page2:1:common 
--js page1addons.js 
--module page1addons:1:page1 

、あなたはページ1とページ2のモジュールは、共通のモジュールおよびpage1addonsモジュールは、ページ1モジュールに依存していること依存コンパイラを語っています。

コンパイラは、モジュールソースファイルから他のモジュール出力ファイルにコードを移動できますが、モジュールがそのモジュールでのみ使用されていると判断した場合、そのコードを移動できます。

これには、closure-libraryやgoog.require/callの使用や、出力へのコードの追加は必要ありません。コンパイラが依存関係を自動的に判断したり、依存関係を管理できるようにしたい場合は、goog.require/callが必要です。

+3

アップ票。これはすばらしい簡潔な答えであり、素晴らしい例です。完璧。あなたの答えをテストする際に、名前にピリオドまたはダッシュを含むモジュールを作成することができませんでした。それが可能なのですか、何か間違っていますか?例: '--module common.min:1'は私にとってはうまくいかなかった。 (私がうまくいきませんでした、私はモジュールが作成されていないことを意味します)。 – Karl

+0

私はこれを行う方法の私のブログで簡単な例で書きました。他の人が興味を持っている場合のための共有:http://www.syntaxsuccess.com/viewarticle/lazy-loading-with-the-closure-compiler – TGH

関連する問題