gwt多个模块没有冗余代码

时间:2013-07-30 09:07:36

标签: gwt

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

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

根据

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

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

任何提示都非常感谢!

2 个答案:

答案 0 :(得分:1)

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

一种解决方案可能是创建一个大模块,但使用类似于模块结构的code splitting。比你没有得到一个非常大的单片JavaScript文件,但是'模块'是根据需要加载的。

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

答案 1 :(得分:1)

正如您所说的GWT文档中所述,GWT机制面对避免冗余代码的问题是将所有模块合并到一个super-gwt模块中,其中包括您的应用程序中的所有子模块。 / p>

我想您正在为您的网站上的不同页面或功能生成一个模块,因此,正如我所说,使用一个独特的模块意味着您需要一种机制来运行每页的相应应用程序代码,基于网址或其他东西。

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

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

这个解决方案的优点很多:

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

否则,如果您继续需要单个模块,那么编译所有模块的方法就是您实际执行的操作:每个模块执行一次gwt编译器(和置换)。但是,您可以改善编译时间,使用像Jenkins这样的持续集成集群并行并行运行作业,或者使用更强力(内存,CPU,...)。