您以前可能听说过 Google Web Toolkit (GWT),它支持以 Java 编程语言编写 Web 应用程序,然后将 Web 应用程序编译为 JavaScript 以便在 Web 浏览器中运行。这允许通过利用 Java 的静态类型和 Eclipse 之类的出色工具提高生产力。您也许看到过一些构建在 GWT 上的有用的、流行的小部件。有一点您也许不知道,GWT 支持创建高性能 Web 应用程序。
先决条件
本文将查看几个 GWT 特性,以及这些特性如何帮助您构建高性能 Web 应用程序。本文不是一个 GWT 简介,我们假定您拥有 GWT 经验。本文还假定您了解 Java 技术并熟悉 JavaScript、CSS 和 HTML。本文使用 Google Plug-in for Eclipse,使用的版本为 Google Plug-in V1.1 和 Eclipse V3.5 (Galileo)。本文还使用 Firebug plug-in for Mozilla Firefox,使用的版本为 Firebug V1.4.2 和 Firefox V3.5.2。
更快的 JavaScript
GWT 以将 Java 编译为 JavaScript 的能力而著名,支持开发人员开发动态 Web 应用程序。所有代码都编译为 JavaScript,GWT 的许多性能特性的设计目标都是为了使 JavaScript 在浏览器中运行得更快。GWT 中有几个这样的特性,包括特定于浏览器的优化和简化的 Ajax,但多数特性都来自 GWT 的 Java-to-JavaScript 编译器。因此,我们将从这个编译器开始探讨 GWT 的与性能有关的特性。
编译器优化
GWT 编译器将把您的 Java 代码转换为在浏览器中运行的 JavaScript,但它的功能不仅仅是这一点,它还进行大量优化以使您的代码运行更快。然而,要准确理解这些优化的详细过程很困难,因为 GWT 发出的 JavaScript 经过了模糊化,难以阅读。首先,我想指示 GWT 编译器生成一些可以阅读的 JavaScript,这样我们就能更好地理解编译器实施的优化。
GWT 编译器有 3 种运行模式。默认模式是 obfuscated,原因是 GWT 编译器将发出模糊的 JavaScript。这种 JavaScript 不仅难以阅读,它还经过压缩。这使其体积更小,从而能在 Internet 上快速加载。更小的体积也有助于浏览器更快地解析 JavaScript。
您也许会认为在网络上发送经过压缩的 JavaScript 没有什么特别的,因为多数 Web 服务器都使用 gzip 压缩格式发送 JavaScript 且所有现代 Web 浏览器都支持 gzip 格式。但是,GWT 编译器不仅压缩 JavaScript,而且它的压缩方式本质上还支持 gzip 压缩。换句话说,尽管已经经过压缩,GWT 的模糊化的 JavaScript 仍是高度可 gzip 压缩的。这样,如果您的 Web 服务器不使用 gzip,您可以通过使用 GWT 模糊特性获得一个很大的速度提升。但是,即使您的 Web 服务器使用 gzip,您也能从 GWT 模糊特性获得明显的速度提升。
因此,对于生产代码,我们当然希望 GWT 编译器设置为发出模糊 JavaScript。但是,这显然会使发出的 JavaScript 几乎不能被阅读。为了说明这个问题,请查看清单 1 中的一些 GWT 模糊 JavaScript。
清单 1. 模糊化的 JavaScript
function qH(){return np}
function mH(){}
_=mH.prototype=new mu;_.gC=qH;_.tI=0;function
uH(){uH=ZH;sH={};tH=[];sH[LM]=[Is,Hs,Js];sH[JM]=[rt,qt,st];Xv(tH,yn,LM);Xv(tH,To,JM)}
var sH,tH;function AH(a){a.b=oH(new mH);return a}
function BH(a){var b,c,d,e,f,g,h,i,j,k;g=ox(new cx,MM);f=OA(new FA);j=XH(new
VH,NM,OM);KA(f,j.b+sJ+j.c);pw(g.B,PM,true);Zw(gA(QM),f);Zw(gA(RM),g);f.B.focus()
;k=Jg(f.B,NJ).length;k>0&&JA(f,0,k);c=py(new my);Lf((tf(),c.b.B),SM);c.o=true;
b=ox(new cx,TM);b.B.id=UM;i=Py(new Ny);h=Ty(new My);d=UA(new RA);pw(d.B,VM,true);
VA(d,Uy(new My,WM));VA(d,i);VA(d,Uy(new My,XM));VA(d,h);d.b=(kz(),jz);VA(d,b);
Ax(c.j,d);Mx(c);vw(b,FH(new DH,c,g),(sh(),rh));e=KH(new IH,a,g,f,i,h,c,b);
vw(g,e,rh);vw(f,e,(hi(),gi))}
function CH(){return rp}
function xH(){}
幸运的是,可以很容易地 “哄骗” GWT 编译器创建一些人类可读的 JavaScript。这只需向编译器传递一个 -style=PRETTY 参数,使用 Google Plug-in for Eclipse 可以轻松地做到这一点。当您触发一个 GWT 编译时,将显示一个如图 1 所示的对话框。
图 1. GWT 编译器选项