ここに、クライアントバンドルとスクリプトインジェクターを使用した例があります。同期読み込みまたは非同期のいずれかを使用できます。
同期を使用する場合、外部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();