0

大規模なアプリケーションを構築しており、初期化、ユーザー管理などのコア モジュール、カスタマー モジュール、プロダクション モジュールなどの複数のモジュールに分割したいと考えています。</p>

複数の GWT モジュール (GWT 分割手法を使用しない) に分割し、LoginEvent、LogoutEvent などのイベントをブロードキャストするために EventBus を共有したいと考えています。コンパイル時間を短縮し、変更したモジュールのみを再コンパイルしたいので、コード分割手法を使用したくありません。これにより、HTML ホスト ページのスクリプト タグにコメントを付けることで、モジュールを有効または無効にすることもできます。

JSNI を使用して次のコードを記述しました。

CoreModule’s EntryPoint:

private static SimpleEventBus eventBus = null;

public void onModuleLoad() {
    export();
    getEventBus().addHandler(MyEvent.TYPE, new MyEventHandler() {

        @Override
        public void onEvent(MyEvent myEvent) {
            Window.alert(myEvent.getMessage());
        }
    });
}

public static SimpleEventBus getEventBus() {
    if (eventBus == null)
        eventBus = new SimpleEventBus();
    return eventBus;
}

public static native void export() /*-{
    $wnd.getEventBus = $entry(@testExporter.client.TestExporter::getEventBus());
}-*/;

CustomerModule’s EntryPoint:

public void onModuleLoad() {
    Button button = new Button("Click me");
    button.addClickHandler(new ClickHandler() {

        @Override
        public void onClick(ClickEvent event) {
            getEventBus().fireEvent(new MyEvent("Button clicked !"));
        }
    });
    RootPanel.get().add(button);
}

public static native SimpleEventBus getEventBus() /*-{
    // Create a useless eventBus because the GWT compiler make a call to a null instance
    var eventBus = @com.google.gwt.event.shared.SimpleEventBus::new()();
    eventBus = $wnd.getEventBus();
    return eventBus;
}-*/;

しかし、ブラウザで実行すると、Firebug で次の例外が発生します。

uncaugth exception [object Object]

顧客イベントを実装/インターフェースする MyEvent および MyEventHandler クラスもコピーしました。

PS: コンパイルを避けるために、他のモジュール参照にコメントを付けるテクニックも知っています。

4

3 に答える 3

1

クエリで試しているように、コードの一部を jsni 経由で利用可能にし、これらのエクスポートされたメソッドを jsni 経由で呼び出さない限り、異なる GWT コンパイル済みモジュール間でコードを共有することはできません。

ただし、次の点に注意してください。まず、コンパイルごとにクラス/メソッドの名前が異なるため、共有クラスは互換性がありません。次に、コンパイルごとに異なるデッド コード部分が削除されます。

したがって、あなたの場合、エクスポートされたメソッドでSimpleEventBus返されwindow.getEventBusたものは他のモジュールでは知られていませんが、他のモジュールもSimpleEventBus同様に使用しています

必要なことを行う最も簡単な方法は、GWT-exporterを使用することです。最初に、各モジュールでエクスポートする js-api を正しく選択し、どのように名前を付けたいかを選択し、Exportableメソッドを便利に実装して注釈を付けます。次に、通信に使用するオブジェクトを考慮します。これは、一部のオブジェクトが互換性を持たない可能性があるためです。GWT-exporter でサポートされているプリミティブ型、JavaScript オブジェクト、および関数を使用します。

共有クラスの GWT-exporter を使用して、同じ名前空間でそれらに注釈を付けて同じメソッドをエクスポートすると、すべてのモジュールで使用できると思いますが、よくわかりません。

したがって、jsni または gwt-exporter を介して js API をエクスポートし、それらの間で純粋なプリミティブまたは js オブジェクトを転送します。

于 2013-03-25T07:29:57.987 に答える
1

より簡単な答えは、複数のエントリ ポイントを使用しないことです。

==========================================

達成しようとしているのがコードを管理しやすい単位に分割することであり、それらすべてを同じページで使用したい場合は、次のことができます。

  • エントリポイントを持つ「Application.gwt.xml」モジュールを作成します(正しく理解できれば、初期化モジュールと同等です)
  • エントリ ポイント クラスのない「UserManagement.gwt.xml」モジュールを作成する
  • エントリ ポイントなしで他の XXX モジュールを作成する

エントリ ポイントのないモジュールを作成するには、単に削除します

<entry-point class='xxx'/>

「アプリケーション」以外の gwt.xml ファイルから

次に、これらのモジュールを「アプリケーション」モジュールに含める必要があります。

<inherits name="com.yourpackage.Module1Name" />
<inherits name="com.yourpackage.Module2Name" />

次に、モジュール「com.yourpackage.Application」の 1 つの GWT ビルドで、それらすべてをまとめてコンパイルする必要があります。

その際、すべてのモジュールのコンパイル済み *.class ファイルとソース .java ファイルの両方がクラスパスで利用可能であることを確認してください。

「アプリケーション」エントリ ポイントは、他のモジュールのオブジェクトを初期化して使用するだけです。

于 2013-03-27T22:39:20.187 に答える
0

フレームを使用して、WebMessage プロトコルを介してモジュール間の通信をセットアップできます。モジュールが 1 つのページにあり、モジュールが別の戦争にある場合にのみ役立ちます。

于 2014-09-17T13:39:58.440 に答える