【问题标题】:gwt multiple modules without redundant codegwt 多模块无冗余代码
【发布时间】:2013-07-30 09:07:36
【问题描述】:

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

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

根据

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

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

非常感谢任何提示!

【问题讨论】:

    标签: gwt


    【解决方案1】:

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

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

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

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

    这种方案的优点很多:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多