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

时间:2008-12-01 21:23:44

标签: gwt

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

/com.example.EditorApp?id=1

EditorApp模块只获取id的值并加载文档。

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

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

有没人处理过这件事?我正在考虑废弃单独的模块并将它们全部合并到一个编译目标中。唯一的缺点是我们的“应用程序”之间的URL变成了:

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

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

3 个答案:

答案 0 :(得分:8)

我已经在GWT中构建了一些非常大的应用程序,我发现最好将这些应用程序拆分为模块,并将公共代码移动到它自己的区域,就像你已经完成的那样。我们的情况很简单,我们的应用程序的某些部分与其他部分非常不同,所以从编译大小的角度来看它是有意义的。我们的应用程序编译为主要部分300kb,其他部分约25-40kb。如果我们只把它们全部放在一个用户身上就会有600kb的下载,这对我们来说是不可接受的。

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

编译时间不是您通常应该担心的问题,因为如果您有单独的模块,您实际上可以更快地进行编译。我们使用ant构建我们的项目,并且我们将其设置为仅编译已更改的GWT,并且在开发期间仅为一个浏览器构建,我们项目的典型编译时间为20秒,并且我们有很多代码。您可以查看此here的示例。

另一个小问题:我假设您知道您不必使用它生成的默认GWT路径吗?因此,您可以将其放入一个名称如'ui'之类的文件夹中,而不是com.MyPackage.Package。编译完成后,GWT不关心你把它放在哪里,并且对路径变化不敏感,因为它都是从同一目录运行的。

答案 1 :(得分:4)

根据我构建GWT应用程序的经验,在决定是否需要多个模块(有或没有入口点)或一体化时需要考虑一些事项:下载时间(Javascript包大小),编译时间,导航/网址,可维护性/可重用性。

...每个下载时间,代码拆分几乎不需要为了性能原因而闯入不同的模块。

...每个编译时,即使是大型应用程序也可以快速编译,但它可能有助于破坏大型应用程序。

...每个导航/网址,从一个模块导航到另一个模块(假设不同的EntryPoints)可能会很痛苦,因为每个模块都有自己的客户端状态......并且模块之间的导航不是无缝的

...对于可维护性/可重用性,从组织/结构的角度来看,拆分成单独的模块(即使只有一个EntryPoint)也是有帮助的。

我写了一篇关于using GWT Modules的博客文章,以防万一。

答案 2 :(得分:1)

确定。我真的感觉到真的没有“正确”的答案,因为项目变化太大了。它非常依赖于应用程序的性质。

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

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

关于大小......对我们来说,一个模块是280KB,另一个是300KB以上。

我刚刚将所有内容合并回一个模块中。新的组合模块大约为380KB。因此,下载实际上要少一些,因为大多数人都会使用两个屏幕。

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