0

GWT.runAsync(...)モジュールのメソッド内や他のメソッド内から呼び出されるのを見onModuleLoad()たことがあります。そのため、GWT アプリ内のどこからでもフラグメントをプルダウンすることは「合法」であるように思われます。

しかし、これは私に考えさせました: アプリ内のどこからでもコード分割されたフラグメントのダウンロードを開始できる場合、このメソッドを実行したときに実際にプルダウンされる Java クラス (実行時に既に JavaScript にコンパイルされている) は何ですか? ? 明らかにこれは構成可能ですが、サーバー側から引き戻されるものを構成する方法を示すコード例が見つかりません。Codesplittingの公式ドキュメントでさえ、 を呼び出す 方法のクライアント側の例しかありGWT.runAsyncませんが、サーバー側のフラグメントに接続する方法はありません。

JavaDocsでは、このメソッドはオーバーロードされており、次の 2 つのバリアントがあります。

  • runAsync(java.lang.Class<?> name, RunAsyncCallback callback); と
  • runAsync(RunAsyncCallback callback)

前者では、サーバーから引き戻したい特定のクラスを指定できると思いますか? その場合、実行時にサーバー上でクラスを見つけて引き戻すために必要な構成 (クラスパス、検索パスなどの構成) はありますか?

最も重要なことは、後者のオーバーロードがどのように機能するか?! プルバックするクラスを指定していない場合、GWT はどのクラスをプルバックするかをどのように判断するのでしょうか?

私のアプリに次のSomethingクラスが含まれているとします。このクラスは、(何らかの方法で) 特定のモジュールのフラグメントの 1 つに配置され、JavaScript にコンパイルされます。さらに、内部に存在するフラグメントが延期され、モジュールの最初のフラグメントと一緒にダウンロードされないように、正しく構成したとしましょうSomething(したがって、クライアント ブラウザー内でまだ「生きている」わけではありません)。

public class Something {
    // ... Whatever
}

ユーザーがボタン ウィジェットをクリックすると、インスタンスを作成して何かを実行Somethingできるように、フラグメントを含むフラグメントをダウンロードする必要があります。を含むフラグメントを指定するにはどうすればよいですか?SomethingGWT.runAsyncSomething

4

3 に答える 3

2

Thomas が上で投稿したように、GWT コンパイラーは必要なフラグメントを自動的に判断します。コードを分析し、考えられるすべての実行パスをトレースして、どのコードがどこから到達できるかを確認します。たとえば、クラス A (メイン エントリ ポイント クラス)、B、C、D、E、F、および G があり、次の直接呼び出しがあるとします (つまり、GWT.runAsync を使用していません)。

  • A が B にコールする
  • B が C にコール
  • D が E にコール
  • F が E にコール

次に、コンパイラは (おそらく) コードを次のブロックに分割します。

  • A、B、C (A がすぐに必要になるため、すぐにロードされます)
  • D (D で GWT.runAsync が呼び出されたときに読み込まれます)
  • E (GWT.runAsync が D、E、または F で呼び出されたときに読み込まれます)
  • F (F で GWT.runAsync が呼び出されたときに読み込まれます)
  • G (GWT.runAsync が G で呼び出されたときに読み込まれます)

最近、(GWT 2.5 で) 共有セグメントのダウンロード サイズを最適化するために分割が正確に行われるように変更が行われました (上記の例では E)。

そのため、分割ポイントの正確な内容を構成できる設定自体はありませんが、コードをどのように構成するかによって分割ポイントを「選択」できます。いずれにせよ、すべての依存関係を手動で追跡して、必要なすべてのコードが利用可能であることを確認するのは非常に困難です。

コンパイラがコードをどのようにパッケージ化したか、またその理由を知りたい場合は、コンパイル レポートをオンにできます。ここで、GWT は各パッケージのサイズと内容だけでなく、各内容がセグメントに含まれる原因となった実行パス (A が B を呼び出し、B が C を上から呼び出す) も表示します。本当に素晴らしいツールです。

要約すると、コードを少しいじってみて、コンパイラーがパッケージングの決定を行う方法と理由を確実に理解してください。それ以上は、GWT コンパイラーにすばらしい魔法をかけてもらいましょう! :)

アップデート:

Re: 追加の例: GWT コンパイラはどのセグメントをロードするかを知っているので、何も伝える必要はありません。これはすべて舞台裏で行われるため、実行することについて心配する必要はありません (ただし、何が起こっているのかを理解することは非常に役立ちます)。

于 2012-10-27T14:11:29.677 に答える
1

これは構成可能ではなく、GWT コンパイラーによって決定されます。実行時に特別なことは何もありません。コンパイラは、生成された JavaScript を.cache.単一のファイルを生成するのではなく、いくつかのファイルに分割しGWT.runAsync、適切なファイルをロードするコードに置き換え.cache.ます。

于 2012-10-27T13:36:53.627 に答える
1

runAsync 内でクラス MyUIScreen のインスタンスを作成するとします。そのクラスがコード内の他の場所で参照されておらず、唯一の場所が runAsync である場合、コンパイラはこれを把握し、コードを MyUIScreen とその他すべてに分割します。大体こんな感じになります。したがって、runAsync からアクセスした瞬間にコード フラグメントがダウンロードされます。

于 2012-10-27T14:10:40.100 に答える