1

我正在尝试找到一种方法来消除客户端 GWT 代码中的冗余编译和 js。问题是他们有一个多入口点站点和一个为每个模块编译的庞大模型。我们谈论的是 30 个 GWT 模块和入口点,每个模块和入口点分别编译应用程序的整个模型包。在我的 8 核怪物上,GWT 编译这个野兽大约需要 15 分钟。是的,编译是并行化的并使用所有内核(在 Ubuntu 中几乎无法移动我的鼠标 :))

我认为将架构更改为单个模块并不是一个真正的选择。有没有办法在模块之间共享继承?模块不一定都那么大,但问题再次是每个模块的所有继承都是冗余编译的。这当然对最终用户也有负面影响,因为每个页面基本上都必须一次又一次地加载整个 model-js。

根据

http://www.gwtproject.org/doc/latest/DevGuideOrganizingProjects.html#DevGuideModuleXml

建议似乎仍然是只制作一个出色的单片模块。没有更好的办法吗?

任何提示高度赞赏!

4

2 回答 2

1

正如您在参考的 GWT 文档中所说,GWT 解决避免冗余代码问题的机制是将所有模块合并到一个 super-gwt-module 中,其中包括您在应用程序中拥有的所有子模块。

我想您正在为您的网站上的不同页面或功能生成一个模块,因此正如我所说,使用一个独特的模块意味着您需要一种机制来根据 url 或其他内容在每个页面上运行适当的应用程序代码.

您可以利用code-splitting,因此您的模块将是 EntryPoints 而不是 RunAsyncCallbacks,并且每个模块将被编译在一个异步加载的 js 片段中。

请注意,您将在所有页面中包含相同的 javascript 片段,这将根据页面加载其他片段。

该解决方案的优点有很多:

  • 您只有一个编译过程。这可能需要很长时间,但肯定会比单独编译所有模块花费的时间要少得多,因为冗余代码将被编译一次。
  • 您可以维护不同.gwt.xml的 ,一个继续开发具有自己的 EntryPoint 的各个模块,另一个没有 EntryPoint 将由您的超级模块继承。
  • 编译后,加载的第一个片段(由所有应用程序共享)将非常小,并且只会缓存一次,因此所有应用程序的加载速度都会非常快。
  • 模块共享的许多代码(gwt-core、jre 等)可以转到第一个片段并由所有模块共享,从而减少每个应用程序的最终下载大小。
  • 这是一个开箱即用的解决方案,gwt 编译器可以很好地拆分代码,将共享代码合并到中间模块,并在需要时添加异步加载片段的方法。
  • Java 生态系统促进了模块化应用程序(依赖项、maven 等)。

否则,如果您继续需要单个模块,那么编译所有模块的方法就是您实际在做的事情:每个模块(和排列)执行一次 gwt 编译器。但是,您可以改进编译时间,拥有像 Jenkins 这样的持续集成集群并并行运行作业,或者使用更多的蛮力(内存、cpu 等)。

于 2013-07-31T09:47:03.367 回答
1

您可能知道 GWT 将每个模块编译成一个大的 JavaScript 文件,并根据有关整个模块中所有内容的所有可用信息优化所有内容。这就是为什么您需要为每个模块编译所有内容的原因。

一种解决方案可能是创建一个大模块,但使用类似于模块结构的代码拆分。比你没有得到一个非常大的整体 JavaScript 文件,而是根据需要加载“模块”。

您是否尝试使用较少的本地工作人员进行编译,而不是使用所有可能的可用内核?将 localworker 设置为 4(即使在 6 核机器上),我得到了最好的结果。

于 2013-07-30T15:00:22.890 回答