3

我试图用 GWT 弄湿我的脚,看看迁移是否会成功。我通常先尝试更困难的部分,以确保我能完成项目。我的项目中最困难的部分是引用 3rd 方 JS 库。在此示例中,我尝试使用 PubNub,因为我们的大部分平台都在使用它。

我想做的是创建一个可重用的对象,可以在其他需要 PubNub 的 GWT 项目中使用。我已经成功运行了一个简单的小测试(即,我已经掌握了 JNSI 的基础知识),但我的问题是 -> 我应该在哪里引用第 3 方脚本以便正确创建库/模块?

现在我只是将外部脚本的引用放在项目的 HTML 页面中,但我很确定从可重用性的角度来看这是不正确的,因为这个库将用于其他项目,每个项目都有自己的基本 HTML 页面。

我尝试将引用放在 gwt.xml 文件中,但这似乎丢失了引用(即我的测试项目不再像脚本在 HTML 页面中时那样工作)

您对如何在可重用的 GWT 库/小部件中包含 3rd 方库有任何提示吗?

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();
  }
} 

[编辑]

更好的方法是使用gwtquery 1.4.0 中名为JsniBundle的新功能。我们在旧金山和法兰克福的GWT.create会议期间介绍了此功能。

使用这种方法,您可以将任何外部 javascript(放置在源代码树中或托管在外部主机中)作为 JSNI 块插入。它有很多好处:

  • 利用 GWT jsni 验证器、混淆器和优化器。
  • 当应用程序不使用它时,摆脱任何 jsni java 方法。

语法其实很简单:

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 回答