gpt4 book ai didi

java - GWT:运行 GWT.runAsync 时会下载哪些类?

转载 作者:行者123 更新时间:2023-12-01 18:58:39 24 4
gpt4 key购买 nike

我见过GWT.runAsync(...)从模块的 onModuleLoad() 内部调用方法以及其他方法,因此从 GWT 应用程序内的任何位置拉取片段似乎都是“合法的”。

但这让我开始思考:如果您可以从应用程序内的任何位置下载代码分割片段,那么当您下载时实际会下载哪些 Java 类(在运行时已编译为 JavaScript)?运行这个方法?显然这是可配置的,但我找不到任何代码示例来说明如何配置从服务器端拉回的内容。即使在 official doc on Codesplitting只有客户端示例如何 调用 GWT.runAsync ,但不是如何将其连接到服务器端片段。

JavaDocs此方法已重载并有两个变体:

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

猜测前者允许您指定要从服务器拉回的特定类?如果是这种情况,是否需要进行任何配置(配置类路径、搜索路径等),以便可以在运行时在服务器上找到该类并将其拉回?

最重要的是,后者的重载是如何工作的?!如果您没有指定要撤回的类,GWT 如何知道要撤回哪些内容?

示例

假设我的应用程序具有以下内容 Something类,然后(以某种方式)放置在特定模块的片段之一中,然后编译成 JavaScript。此外,假设我正确配置了一些东西,以便 Something 的片段存在于其中的内容被推迟,并且不会与模块初始片段一起下载(因此它还没有“存在”在客户端浏览器中)。

public class Something {
// ... Whatever
}

现在用户单击一个按钮小部件,我想要包含 Something 的片段下载,这样我们就可以创建一个 Something实例并用它做一些事情。 如何使用GWT.runAsync指定包含 Something 的片段?

最佳答案

正如 Thomas 在上面发布的,GWT 编译器会自动找出它需要哪些片段。它通过分析代码并跟踪所有可能的执行路径来查看可以从哪里访问哪些代码来实现这一点。例如,假设您有类 A(主入口点类)、B、C、D、E、F 和 G,并且您有以下直接调用(即不使用 GWT.runAsync ):

  • A 调用 B
  • B 调用 C
  • D 调用 E
  • F 调用 E

然后编译器(可能)会将您的代码分成以下 block :

  • A、B、C(由于立即需要 A,因此会立即加载
  • D(在 D 上调用 GWT.runAsync 时加载)
  • E(在 D、E 或 F 上调用 GWT.runAsync 时加载)
  • F(在 F 上调用 GWT.runAsync 时加载)
  • G(在 G 上调用 GWT.runAsync 时加载)

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

因此,虽然没有设置本身允许您配置分割点的确切内容,但您可以通过构建代码的方式“选择”它们。无论如何,手动跟踪所有依赖项以确保所有需要的代码都可用对您来说可能太难了。

如果您有兴趣了解编译器如何打包您的代码以及原因,您可以打开 compile reports 。在这里,GWT 不仅会显示每个包的大小和内容,还会显示导致每个内容包含在段中的执行路径(A 调用 B,B 从上面调用 C)。这确实是一个非常了不起的工具。

因此,总而言之:稍微尝试一下您的代码,以确保您了解编译器如何以及为何做出打包决策,但除此之外,只需坐下来,让 GWT 编译器发挥其令人敬畏的魔力! :)

更新:

回复:您添加的示例:美妙之处在于,GWT 编译器知道要加载哪个段,因此您无需告诉它任何内容。所有这一切都发生在幕后,您无需担心是否会发生(但了解正在发生的事情可能非常有用)。

关于java - GWT:运行 GWT.runAsync 时会下载哪些类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13100333/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com