将Javascript捆绑到GWT应用程序中

将Javascript捆绑到GWT应用程序中,gwt,Gwt,我正在用GWT()编写一个应用程序,它使用googlemapsapi,我想使用。为库编写JSNI包装器不是问题,但我如何确保编译器将JS“烘焙”到应用程序本身中,而不是通过单独下载它们?如果许可证允许您这样做,那么您可以将库的整个JS代码复制并粘贴到JSNI方法中 您也可以使用类似以下的方法: public static interface Resources extends ClientBundle { @Source("some.js") TextResource someJ

我正在用GWT()编写一个应用程序,它使用googlemapsapi,我想使用。为库编写JSNI包装器不是问题,但我如何确保编译器将JS“烘焙”到应用程序本身中,而不是通过单独下载它们?

如果许可证允许您这样做,那么您可以将库的整个JS代码复制并粘贴到JSNI方法中

您也可以使用类似以下的方法:

public static interface Resources extends ClientBundle {
    @Source("some.js")
    TextResource someJs();
}

public void onModuleLoad() {
    final Resources resources = GWT.create(Resources.class);
    eval(resources.someJs().getText());
}

private static native void eval(String s) /*-{
    eval(s);
}-*/;
public interface JsResources extends ClientBundle {
    final JsResources INSTANCE = GWT.create(JsResources.class);

    @Source("myAwesomeJavaScript.js")
    TextResource myAwesomeJavaScript();
}

“some.js”的文本将直接插入生成的应用程序中。不会有任何单独的下载。

对您的需要有用吗?

在GWT2.4中添加了脚本

ScriptInjector.fromUrl(“http://example.com/foo.js)setCallback(
新回调函数(){
公共失效失效失效(异常原因){
警告(“脚本加载失败”);
}
成功时公开作废(作废结果){
警告(“脚本加载成功”);
}
}).inject();

您可以为JavaScript资源定义ClientBundle,如下所示:

public static interface Resources extends ClientBundle {
    @Source("some.js")
    TextResource someJs();
}

public void onModuleLoad() {
    final Resources resources = GWT.create(Resources.class);
    eval(resources.someJs().getText());
}

private static native void eval(String s) /*-{
    eval(s);
}-*/;
public interface JsResources extends ClientBundle {
    final JsResources INSTANCE = GWT.create(JsResources.class);

    @Source("myAwesomeJavaScript.js")
    TextResource myAwesomeJavaScript();
}
并使用ScriptInjector将其包含在您的应用程序中:

ScriptInjector
    .fromString( JsResources.INSTANCE.myAwesomeJavaScript().getText() )
    .inject();

不,我在v3上,似乎还没有人拥有v3的实用程序GWT端口:(是的,我可以,但我真的想要更干净的东西。我可能会在构建过程中将文件作为依赖项移入。@Sudhir:我完全理解这一点。然而,gwtc只是一个Java到JavaScript的编译器/转换器,它还可以包含JSNI提供的JavaScript。因此我看不到直接的方法。也许你可以构建一个间接的解决方案,如这:将JS代码作为TextResource(ClientBundle)包含,然后评估JSNI中的文本。还没有尝试过!现在,它可以将js文件标记为脚本资源,并确保在模块运行之前下载该文件。我正在尝试看看是否有人知道我可以告诉GWT将该文件放入模块本身的方法。它仍然会做完全相同的事情,请求更少。@Sudhir:我给出了TextResource是一个快速的尝试(请参阅更新的答案)。它很有效,结果是,您实际收到的请求更少。顺便问一下,如何将js文件标记为“脚本资源”,听起来很有趣?@Chris谈到了这一点……只需在模块文件中添加一个脚本标记。GWT将确保在模块运行之前下载该脚本。这可以是外部js(谷歌地图?)或者像现在这样的内部。页面执行会等待此请求完成,但这是一个不必要的瓶颈。哇。看起来从1.6:Dimo这是最好的解决方案,将js绑定到textresource将减少加载js的额外http请求。