3

移行がうまくいくかどうかを確認するために、GWTで足を濡らそうとしています。私は通常、プロジェクトを完了できることを確認するために、最初に難しい部分を試します。私のプロジェクトで最も難しい部分は、サードパーティのJSライブラリを参照することです。この例では、プラットフォームの多くがPubNubを使用しているため、PubNubを使用しようとしています。

私がやりたいのは、PubNubを必要とする他のGWTプロジェクトで使用できる再利用可能なオブジェクトを作成することです。簡単な小さなテストが正常に実行されています(つまり、JNSIの基本が機能しています)が、私の質問は->ライブラリ/モジュールを適切に作成するためにサードパーティのスクリプトへの参照をどこに置くかです?

今のところ、プロジェクトのHTMLページに外部スクリプトへの参照を配置していますが、このライブラリは他のプロジェクトで使用されるため、再利用性の観点からは正しくないことは間違いありません。ベースHTMLページ。

参照をgwt.xmlファイルに入れようとしましたが、参照が失われているようです(つまり、スクリプトがHTMLページにあるときのようにテストプロジェクトが機能しなくなりました)

再利用可能なGWTライブラリ/ウィジェットにサードパーティのライブラリを含める方法に関するヒントはありますか?

4

1 に答える 1

4

ここに、クライアントバンドルとスクリプトインジェクターを使用した例があります。同期読み込みまたは非同期のいずれかを使用できます。

同期を使用する場合、外部jsコンテンツはアプリケーションに埋め込まれます。それ以外の場合は、ajaxリクエストで取得される別のフラグメントに含まれます。

APIを任意のサーバーに配置し、ScriptInjectorを使用してロードできます。

public class Example {

  public static interface MyApiJs extends ClientBundle {
    MyApiJs INSTANCE = GWT.create(MyApiJs.class);

    @Source("my_api.js")
    TextResource sync();

    @Source("my_api.js") // Should be in the same domain or configure CORS
    ExternalTextResource async();
  }

  public void loadSync() {
    String js = MyApiJs.INSTANCE.sync().getText();
    ScriptInjector.fromString(js).inject();
  }

  public void loadAsync() throws ResourceException {
    MyApiJs.INSTANCE.async().getText(new ResourceCallback<TextResource>() {
      public void onSuccess(TextResource r) {
        String js = r.getText();
        ScriptInjector.fromString(js).inject();
      }
      public void onError(ResourceException e) {
      }
    });
  }

  public void loadFromExternalUrl() {
    ScriptInjector.fromUrl("http://.../my_api.js").inject();
  }
} 

[編集]

より良いアプローチは、JsniBundleという名前のgwtquery1.4.0の新機能を使用することです。この機能は、サンフランシスコとフランクフルトで開催されたGWT.createカンファレンスで紹介されました。

このアプローチでは、任意の外部JavaScript(ソースツリーに配置されているか、外部ホストでホストされている)をJSNIブロックとして挿入できます。これには多くの利点があります。

  • GWT jsniバリデーター、難読化ツール、オプティマイザーを活用してください。
  • アプリケーションが使用しない場合は、jsnijavaメソッドを削除します。

構文は実際には簡単です。

public interface JQueryBundle extends JsniBundle {
  @LibrarySource("http://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js")
  public void initJQuery();
} 

JQueryBundle jQuery = GWT.create(JQueryBundle.class);
jQuery.initJQuery();
于 2012-10-11T05:09:47.243 に答える