12

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

/com.example.EditorApp?id=1

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

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

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

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

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

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

4

3 回答 3

8

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

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

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

另一件小事:我假设您知道您不必使用它生成的默认 GWT 路径?因此,您可以将 com.MyPackage.Package 替换为一个具有好听名称的文件夹,例如 'ui' 或其他名称。编译后的 GWT 不关心你把它放在哪里,并且对路径更改不敏感,因为它都从同一个目录运行。

于 2008-12-01T23:51:19.663 回答
4

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

...每次下载时,代码拆分几乎可以避免出于性能原因分解成不同模块的需要。

...每次编译时,即使是大型应用程序也可以很快编译,但它可能有助于分解大型应用程序。

...每个导航/url,从一个模块导航到另一个模块(假设不同的入口点)可能会很痛苦,因为每个模块都有自己的客户端状态......并且跨模块导航不是无缝的。

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

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

于 2011-02-22T19:23:54.677 回答
1

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

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

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

关于大小……对我们来说,一个模块是 280KB,另一个是 300KB 多一点。

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

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

于 2008-12-03T20:40:55.897 回答