GWT中的大型应用程序:一个模块,还是几个?

GWT中的大型应用程序:一个模块,还是几个?,gwt,Gwt,为了在我们的应用程序的各个部分之间提供良好的URL,我们将所有内容拆分为几个独立编译的模块。例如,有一个“管理器”部分和一个“编辑器”部分。编辑器将在新窗口中启动。通过这样做,我们可以直接链接到编辑器: /com.example.EditorApp?id=1 EditorApp模块只获取id的值并加载文档 问题是两个模块之间的所有公共代码都在输出中重复。这包括任何静态内容(图形)、样式表等 另一个问题是生成JavaScript的编译时间几乎是原来的两倍,因为我们在两个模块之间共享了一些复杂的代

为了在我们的应用程序的各个部分之间提供良好的URL,我们将所有内容拆分为几个独立编译的模块。例如,有一个“管理器”部分和一个“编辑器”部分。编辑器将在新窗口中启动。通过这样做,我们可以直接链接到编辑器:

/com.example.EditorApp?id=1
EditorApp模块只获取id的值并加载文档

问题是两个模块之间的所有公共代码都在输出中重复。这包括任何静态内容(图形)、样式表等

另一个问题是生成JavaScript的编译时间几乎是原来的两倍,因为我们在两个模块之间共享了一些复杂的代码,这些代码需要处理两次

有人处理过这件事吗?我正在考虑放弃单独的模块,并将其全部合并回一个编译目标。唯一的缺点是我们的“应用程序”之间的URL类似于:

/com.example.MainApp?mode=editor&id=1

每个窗口加载主模块,检查mode参数的值,并调用相应的模块初始化代码

我已经在GWT中构建了一些非常大的应用程序,我发现最好将它们分成模块,并将通用代码转移到它自己的领域,就像您所做的那样。我们案例中的原因很简单,我们的应用程序的某些部分与其他部分非常不同,因此从编译大小的角度来看,这是有意义的。我们的应用程序主要部分编译到300kb,其他部分大约编译到25-40kb。如果我们只是把它们放在一个用户会留下一个600kb的下载,这对我们来说是不可接受的

从设计和可重用性的角度来看,尽可能地将事物分离开来也更有意义,因为我们已经重用了我们在这个项目上构建的许多模块

编译时不是您通常应该担心的事情,因为如果您有单独的模块,实际上可以使它更快。我们使用ant来构建我们的项目,我们将其设置为只编译已经更改的GWT,并且在开发过程中只为一个浏览器构建,我们项目的典型编译时间是20秒,我们有很多代码。你可以看到这个例子


还有一件小事:我假设您知道不必使用它生成的默认GWT路径?因此,您可以不使用com.MyPackage.Package,而是将其放入一个名为“ui”之类的文件夹中。编译后的GWT不关心您将它放在哪里,并且对路径更改不敏感,因为它都从同一个目录运行。

Ok。我真的感觉到没有“正确”的答案,因为项目千差万别。这在很大程度上取决于应用程序的性质

我们的主要构建由许多内部模块和第三方模块组成。它们都在单独的项目中进行管理。这是有道理的,因为它们在不同的地方使用

但是,在一个项目中设计多个模块作为一个完整的应用程序运行似乎过于复杂了。这两个模块的最初目的是在新窗口中打开不同屏幕时保持URL的简单。尽管有多个构建目标,但它们都使用非常大的通用代码子集(包括自定义XML/POJO编组库)

关于尺寸。。。对我们来说,一个模块是280KB,另一个刚刚超过300KB

我刚刚把所有的东西都合并成一个模块。新的组合模块大约为380KB。因为大多数人都会同时使用这两个屏幕,所以实际上下载起来就少了一点


还记得有一个完美的缓存,所以380KB应该只下载一次,除非应用程序被改变了。

< P>从我构建GWT应用程序的经验来看,在决定是否需要多个模块(有或没有入口点)时,有一些事情要考虑,或者一个一个:下载时间(JavaScript束大小),编译时间,导航/url和可维护性/可重用性

…每次下载时,由于性能原因,代码拆分几乎不需要分成不同的模块

…根据编译时间,即使是大型应用程序也可以很快编译,但这可能有助于大型应用程序的分解

…根据导航/url,从一个模块导航到另一个模块(假设入口点不同)可能是一件痛苦的事情,因为每个模块都有自己的客户端状态…而且跨模块导航也不是无缝的

…根据可维护性/可重用性,从组织/结构的角度来看,将其拆分为单独的模块(即使只有一个入口点)是有帮助的


我写了一篇关于的博文,以防万一

我们的应用程序以HTTPS方式运行,因此在多次访问时没有缓存,因此大小对我们来说非常重要。我认为在大多数情况下,正确的答案是将它们分开,以便于维护、管理和编译speed@rustyshelf:HTTPS并不意味着没有缓存。这可能会有帮助:是的。在GWT2.x发布之前,我问过这个问题。自从.link过期以来,事情变得更加简单和强大