GWT:运行GWT.RunAsync时下载了哪些类

  • 本文关键字:GWT 运行 RunAsync 下载 java gwt
  • 更新时间 :
  • 英文 :


我已经看到我从模块的onModuleLoad()方法以及其他方法中拨打了GWT.runAsync(...),因此从GWT中的任何地方中拉下片段似乎是"合法"的app。

但这让我想到:如果您可以从应用程序中的任何地方启动下载代码的片段,那么什么是Java类(在运行时已将其编译为JavaScript),实际上在您时被拉下来了运行此方法?显然,这是可配置的,但是我找不到任何代码示例,这些示例显示了如何配置从服务器端撤回的内容。即使在官方文档上有关代码的官方文档,也只有客户端示例 call GWT.runAsync,但如何将其连接到服务器端片段。

在Javadocs中,此方法已重载,并且具有两个变体:

  • runAsync(java.lang.Class<?> name, RunAsyncCallback callback);和
  • runAsync(RunAsyncCallback callback)

猜测前者允许您指定要从服务器拉回的特定类?如果是这样,是否需要执行任何配置(配置类Path,SearchPath等),以便可以在运行时在服务器上找到该类并撤回?

最重要的是,后者的过载如何工作?如果您没有指定课程的返回,GWT如何知道要撤回什么?

示例

说我的应用中有以下Something类,然后将其放置在特定模块的一个片段之一内,然后将其编译到JavaScript中。此外,假设我正确配置了物品,以便将Something生活在内部的片段被推迟并且不会使用模块初始片段下载(因此尚未在客户端浏览器内"生活")。

)。
public class Something {
    // ... Whatever
}

现在,用户单击一个按钮小部件,我希望包含 Something的片段下载,以便我们可以创建一个 Something实例并对其进行操作。如何使用GWT.runAsync指定包含Something的片段?它需要自动。它通过分析您的代码并追踪所有可能的执行路径来查看可以从哪里达到哪些代码。例如,假设您有A类(主要入口点类),B,C,D,E,F和G,并且您具有以下 Direct 调用(即不使用GWT.RunAsync)):

  • 呼叫b
  • b调用c
  • D致电E
  • f调用e

然后,编译器将(可能)将您的代码分为以下块:

  • a,b,c(立即将其立即加载
  • d(gwt.runasync被称为d时加载)
  • e(gwt.runasync在d,e或f上被加载时已加载)
  • f(gwt.runasync被称为f时加载)
  • g(gwt.runasync被称为g时加载)

最近发生了更改(在GWT 2.5中),以确切的方式进行分割以优化共享段的下载大小(在上面的示例中e)。

因此,虽然没有设置本身可以使您配置拆分点的确切内容,但您可以通过如何构造代码来"选择"它们。无论如何,无论如何,您都可能难以手动跟踪所有依赖项,以确保所有需要的代码可用。

如果您有兴趣查看编译器如何打包您的代码以及为什么可以打开编译报告。在这里,GWT不仅会向您展示每个软件包的大小和内容,还会向您显示执行路径(从上方的A调用B,B调用C),它导致每个内容都包含在细分市场中。这确实是一个很棒的工具。

因此,总而言之:稍微浏览您的代码,以确保您了解编译器如何以及为什么做出包装决定,但是除此之外,只需坐下来,让GWT编译器做得很棒!:)

更新:

re:您的添加示例:美观是,GWT编译器知道要加载哪个细分市场,因此您无需告诉任何内容。所有这些都发生在幕后,您不必担心使它发生(但是了解发生的事情可能非常有用)。

是无法配置,它由GWT编译器确定。在运行时没什么特别的,编译器只需将生成的JavaScript拆分在几个.cache.文件中而不是生成一个文件,然后用代码代替GWT.runAsync来加载适当的.cache.文件。

假设您在RunAsync内部创建一个类Myuiscreen的实例。如果该类未在您的代码中的其他任何地方引用,而唯一的位置是RunAsync,则编译器将弄清楚这一点,并将您的代码分解为Myuiscreen和其他所有内容。这大致就是将会发生的事情。因此,当您从RunAsync

访问时,代码片段将下载

最新更新