GWT减少编译的javascript大小

时间:2011-03-23 21:04:10

标签: javascript gwt

我发现编译后的JavaScript的大小增长速度比我预期的要快。在我的项目中添加几行Java代码可以将脚本大小增加到几Kbs。

目前,我编译的项目重量为1Mb。除了MVP(活动和场所),测试(JUnit)和日志记录之外,我没有使用任何外部库。

我想知道是否有任何编码实践/建议来保持编译脚本尽可能小。我不是指代码拆分,而是编码技术或模式,可以使编译的JavaScript有效地缩小。

非常感谢

2 个答案:

答案 0 :(得分:23)

GWT使用“按需付费”的设计理念,并且由于您不允许使用反射,编译器可以静态地(在逐个方法的基础上)证明一段代码是“可到达的”,并消除那些不是。例如,如果您从未在ArrayList上使用remove()方法,则该代码不会包含在生成的JavaScript中。

如果你看到只有几行的几千字节跳跃,这可能意味着你已经引入了一种你尚未使用的新类型(可能还有一种取决于其他新类型)使用。这也可能意味着您已经做了一些更改,将这种新类型“通过线路”发送回服务器,在这种情况下,GWT生成器必须包含用于封送该类型的JavaScript,以及可通过其访问的任何新类型“has-a”和“is-a”引用。

所以,如果是我,我会从那里开始:当你发现2行变化使得千兆字节增加时,首先查看类型并询问它是否是您之前使用过的类型,以及是否你是通过电线发送一种新型的,这种类型是否也取决于引擎盖下的其他类型。

最后一个想法:在Ray Ryan 2009年Google I / O的演讲中,他提到了他从GWT编译团队中挑选过的迷信,他们建议不要使用泛型类型(我不是在谈论Java泛型,而是超类型)作为RPC参数&返回值。特别是,不是让你的RPC调用获取或返回一个Map,而是让它接受或返回一个HashMap。相信GWT生成器可以缩小它在编译时必须创建的序列化代码量(例如,因为它可以避免生成TreeMap的序列化代码)。

我希望这会有所帮助。

答案 1 :(得分:4)

GWT为每个支持的浏览器创建不同的输出版本,因此当您说项目大小为1MB时,您是否指的是这些的组合大小? (每个浏览器只下载它实际需要的那个)。

在使用各种继承/类/泛型构造时,我试图尝试生成的输出。不幸的是,引入的额外复杂性远大于获得的小尺寸改进(当fx。倾销泛型时)。

我参与过一些大型GWT项目(+50.000行),并发现代码混淆,加上在Web服务器上启用压缩是最简单的最有效的方式来最小化下载。如果这不足以缩小代码,那么请查看GWT的compilation report,您可以使用它来查明潜在的有问题的类和插入代码拆分的位置。