ClientBundles和GWT中的代码分裂?

时间:2014-05-12 07:23:55

标签: java gwt clientbundle

我有一个ClientBundle,它定义了一堆TextResourceImageResource个元素。

对于我网站上的每个页面,我计划设置一个代码分割点,它将仅运行该给定页面的视图/演示者。

我的问题是,我说有一个名为logo()的ImageResource,以及一个名为fooJs()的文本资源。我只访问MyClientBundle.INSTANCE.logo()和MyClientBundle.INSTANCE.fooJs()from a Gwt.runAsync`阻止。

其他页面将访问MyClientBundle.INSTANCE以加载其他图像/ textResources,这些图像/ textResources特定于这些页面(在他们自己的GWT.runAsync块中)。但logo()fooJs只会在一次代码拆分中被引用。

我的问题是,logo图片和fooJs textResource是否只会捆绑在代码拆分文件中,还是会被添加到启动js中,还是会添加到片段左侧?

基本上我要做的就是为每个页面拆分图像/视图/演示者,以减少脚本的初始下载大小。

1 个答案:

答案 0 :(得分:1)

看起来GWT编译器会将ClientBundle中的各个资源分开。

考虑以下模块:

public class ClientBundleCodeSplittingExample implements EntryPoint {

  public interface MyResources extends ClientBundle {
    public static final MyResources INSTANCE = GWT.create(MyResources.class);

    @ClientBundle.Source("resource1.txt")
    public TextResource resource1();

    @ClientBundle.Source("resource2.txt")
    public TextResource resource2();
  }

  /**
   * This is the entry point method.
   */
  public void onModuleLoad() {
    Window.alert("Resource 1: " + MyResources.INSTANCE.resource1().getText());

    GWT.runAsync(new RunAsyncCallback() {
      @Override
      public void onFailure(Throwable throwable) {
        Window.alert("Code download failed");
      }

      @Override
      public void onSuccess() {
        Window.alert("Resource 2: " + MyResources.INSTANCE.resource2().getText());
      }
    });
  }
}

在与模块入口点类相同的包中有2个名为resource1.txtresource2.txt的文本文件,其中包含不同且易于识别的字符串作为文本文件的内容。如果使用选项-style PRETTY编译模块并检查生成的javascript,您可以看到resource1.txt的内容包含在主模块javascript中,resource2.txt的内容是只包含在将被加载的javascript中。