我正试图让我的脚湿透GWT,看看迁移是否会成功。我通常先尝试更难的部分,以确保我能完成项目。我项目中最困难的部分是引用第三方JS库。在这个例子中,我正在尝试使用PubNub,因为我们的平台很多都使用它。
我想要做的是创建一个可重用的对象,可以在需要PubNub的其他GWT项目中使用。我已经成功运行了一个简单的小测试(即,我已经掌握了JNSI的基础知识),但我的问题是 - >在哪里可以将引用放到第三方脚本中以便正确创建库/模块?
现在我只是在项目的HTML页面中引用外部脚本,但我很确定从可重用性的角度看这是不正确的,因为这个lib将用于其他项目,每个项目都会拥有自己的基本HTML页面。
我尝试将引用放在gwt.xml文件中,但这似乎丢失了引用(即我的测试项目不再像脚本在HTML页面中那样工作)
您是否有关于如何在可重用的GWT库/小部件中包含第三方库的任何提示?
答案 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]
更好的方法是在名为gwtquery的JsniBundle 1.4.0中使用新功能。我们在旧金山和法兰克福的GWT.create会议期间介绍了此功能。
使用此方法,您可以将任何外部javascript(放置在源树中或托管在外部主机中)作为JSNI块插入。它有很多好处:
语法实际上很简单:
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();