如何在可重用的gwt库/小部件中包含第三方JavaScript库?

时间:2012-10-10 04:54:01

标签: gwt pubnub

我正试图让我的脚湿透GWT,看看迁移是否会成功。我通常先尝试更难的部分,以确保我能完成项目。我项目中最困难的部分是引用第三方JS库。在这个例子中,我正在尝试使用PubNub,因为我们的平台很多都使用它。

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

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

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

您是否有关于如何在可重用的GWT库/小部件中包含第三方库的任何提示?

1 个答案:

答案 0 :(得分: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();
  }
} 

[EDITED]

更好的方法是在名为gwtqueryJsniBundle 1.4.0中使用新功能。我们在旧金山和法兰克福的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();