1

クライアントの GWT コードから冗長なコンパイルと js を取り除く方法を見つけようとしています。問題は、複数の EntryPoint サイトと、モジュールごとにコンパイルされる大規模なモデルがあることです。ここでは、アプリのモデル パッケージ全体を個別にコンパイルする 30 個の GWT モジュールとエントリ ポイントについて説明します。この獣を GWT でコンパイルするだけでも、8 コアのモンスターで約 15 分かかります。はい、コンパイルは並列化され、すべてのコアを使用します (Ubuntu でマウスをほとんど動かすことができません :))

アーキテクチャを単一のモジュールに変更することは、実際には選択肢ではないと思います。モジュール間で継承を共有する方法はありませんか? モジュールは必ずしもすべてがそれほど大きくはありませんが、問題は、すべての継承がモジュールごとに重複してコンパイルされることです。もちろん、これはエンドユーザーにも悪影響を及ぼします。これは、すべてのページが基本的に model-js 全体を何度もロードする必要があるためです。

によると

http://www.gwtproject.org/doc/latest/DevGuideOrganizingProjects.html#DevGuideModuleXml

提案は、1 つの優れたモノリシック モジュールを作成することであるように思われます。何か良い方法はありませんか?

どんなヒントでも大歓迎です!

4

2 に答える 2

1

ご存じのとおり、GWT は各モジュールを 1 つの大きな JavaScript ファイルにコンパイルし、モジュール全体のすべてに関する利用可能なすべての情報に基づいてすべてを最適化します。これが、モジュールごとにすべてをコンパイルする必要がある理由です。

1 つの解決策は、1 つの大きなモジュールを作成することですが、モジュール構造と同様のコード分割を使用します。非常に大きなモノリシック JavaScript ファイルを 1 つ取得するのではなく、必要に応じて「モジュール」が読み込まれます。

利用可能なすべてのコアを使用する代わりに、より少ない localworker でコンパイルしようとしましたか? localworker を 4 に設定すると、最高の結果が得られました (6 コアのマシンでも)。

于 2013-07-30T15:00:22.890 に答える
1

参照している GWT ドキュメントで述べられているように、冗長コードを回避するという問題に直面する GWT メカニズムは、すべてのモジュールを、アプリケーションにあるすべてのサブモジュールを含むスーパー gwt モジュールにマージすることです。

Web サイトの別のページまたは機能用のモジュールを作成しているとします。つまり、独自のモジュールを使用するということは、URL などに基づいて、ページごとに適切なアプリケーション コードを実行するメカニズムが必要になることを意味します。 .

コード分​​割を利用すると、モジュールは RunAsyncCallbacks ではなく EntryPoints になり、各モジュールは 1 つの js フラグメントにコンパイルされ、非同期的にロードされます。

すべてのページに同じ JavaScript フラグメントを含めることに注意してください。これにより、ページに応じて他のフラグメントが読み込まれます。

このソリューションには多くの利点があります。

  • コンパイル プロセスは 1 つだけです。長い時間がかかる可能性がありますが、冗長なコードは 1 回コンパイルされるため、すべてのモジュールを個別にコンパイルするよりもはるかに短い時間で済みます。
  • .gwt.xml独自の EntryPoint を使用して個々のモジュールの開発を継続するものと、スーパーモジュールによって継承される EntryPoint を使用しないものとで、異なる を維持できます。
  • コンパイルが完了すると、最初に読み込まれる (すべてのアプリで共有される) フラグメントは非常に小さく、一度だけキャッシュされるため、すべてのアプリが非常に高速に読み込まれます。
  • モジュール (gwt-core、jre など) によって共有されるコードの多くは、最初のフラグメントに移動でき、すべてのモジュールによって共有されるため、各アプリの最終的なダウンロード サイズが減少します。
  • これはすぐに使用できるソリューションです。gwt コンパイラは、コードを分割し、共有コードを中間モジュールにマージし、必要に応じてフラグメントを非同期にロードするメソッドを追加することを適切に行います。
  • Java エコシステムは、モジュラー アプリ (依存関係、Maven など) を容易にします。

それ以外の場合は、個々のモジュールが引き続き必要な場合、それらすべてをコンパイルする方法は、実際に行っていることです。つまり、モジュールごとに 1 回 gwt コンパイラを実行します (および順列)。ただし、Jenkins のような継続的インテグレーション クラスターを使用してジョブを並行して実行するか、総当たり攻撃 (メモリ、CPU など) を使用することで、コンパイル時間を改善できます。

于 2013-07-31T09:47:03.367 に答える