2008-12-01 69 views
12

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

/com.example.EditorApp?id=1 

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

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

而另一个问题是编译时生成JavaScript是近一倍,因为我们有具有将被处理两次两个模块之间共享一些复杂的代码。

有没有人处理过这个?我正在考虑拆分单独的模块并将它们全部合并到一个编译目标中。唯一的缺点是我们的“应用程序”的网址成为了类似:

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

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

+0

这可能有所帮助:http://code.google.com/webtoolkit/doc/latest/DevGuideCodeSplitting.html – 2010-12-30 08:17:51

+0

是的。我在GWT 2.x发布之前问过这个问题。事情变得更加简单和强大。 – 2010-12-31 06:16:01

回答

8

我已经建立了GWT几个非常大的应用程序,而且我觉得最好的东西分割成模块,以及通用代码移动到它自己的区域,像你这样做。在我们的例子中,原因很简单,我们的应用程序的某些部分与其他部分非常不同,所以从编译大小的角度来看它是有意义的。我们的应用程序的主要部分编译为300kb,其他部分编译为25-40kb。如果我们把它们全部放入一个,用户将被留下600kb的下载,这对我们来说是不可接受的。

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

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

另一个小问题:我假设您知道您不必使用它生成的默认GWT路径?所以,而不是com.MyPackage.Package,你可以把它放在一个文件夹中,名字好像'ui'或其他东西。一旦编译过的GWT不关心你的放置位置,并且对路径变化不敏感,因为它全部来自同一个目录。

+0

链接现在看起来已经过期 – 2014-01-23 03:17:47

1

好的。我真的明白,那里真的没有“正确”的答案,因为项目差异很大。这非常依赖于应用程序的性质。

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

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

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

刚刚完成将所有事情合并回单一模块。新的组合模块大约为380KB。所以下载实际上会少一点,因为大多数人都会使用这两个屏幕。

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

4

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

...每次下载时,代码拆分几乎不会因为性能原因而需要打入不同的模块。

...每编译一次,即使是大的应用程序编译也相当快,但它可能有助于解决大型应用程序的问题。因为每个模块都有它自己的客户端状态......并且导航并不是无缝的,所以在每个导航/ url中,从一个模块导航到另一个模块可能会很痛苦(假设不同的EntryPoints)模块。

...对于每个可维护性/可重用性,从组织/结构的角度来看,可以将它们分成单独的模块(即使只有一个EntryPoint)。

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

相关问题