GWT的最大陷阱是什么?

189

我目前正在使用GWT实现一个项目的开发,是否有人在使用GWT(和GWT-EXT)时遇到了无法克服的主要问题?从性能角度来看呢?

我们已经看到/听到的一些事情包括:

  • 谷歌不能够索引内容
  • CSS和样式方面似乎有点不稳定

同时也希望得到关于这些问题的额外反馈。谢谢!


4
最近我注意到,一些基于GWT的网站在我的谷歌搜索结果中能正确显示,尽管底层HTML并没有包含我要搜索的信息(例如examples.roughian.com有几个这样的结果)。看起来,谷歌索引器必须进行一些智能的JavaScript渲染,以便确定页面加载后实际显示的内容。 - StriplingWarrior
24个回答

231

我首先要说的是,我是GWT的粉丝,但是也确实存在许多问题,不过大多数问题我们都能够克服:

问题:长时间编译。随着您的项目增长,编译所需的时间也会增加。我听说过20分钟的编译报告,但我的平均编译时间约为1分钟。

解决方案:将代码拆分为单独的模块,并告诉Ant仅在更改时构建它。此外,在开发过程中,通过只构建一个浏览器,您可以大大加快编译速度。您可以通过将以下内容放入.gwt.xml文件中来实现:

<set-property name="user.agent" value="gecko1_8" />

在这段代码中,gecko1_8是指Firefox 2+,ie6是指IE等。


问题:Hosted mode非常慢(至少在OS X上),并且无法与您编辑诸如JSP或Rails页面并在浏览器中刷新以获取“实时”更改的情况相媲美。

解决方案:您可以给托管模式提供更多内存(我通常为512M),但它仍然很慢。我发现一旦您使用GWT足够熟练,就不再使用此功能。您进行大量更改,然后只为一个浏览器编译(通常耗时20秒),然后在浏览器中点击刷新即可。

更新:使用GWT 2.0+,这不再是一个问题,因为您使用新的“开发模式”。它基本上意味着您可以直接在所选的浏览器中运行代码,因此不会损失速度,并且您可以使用firebug/inspect等功能。

http://code.google.com/p/google-web-toolkit/wiki/UsingOOPHM


问题:GWT代码是Java,并且具有不同的HTML页面布局方式,这使得将HTML设计转换为GWT更加困难。

解决方案:同样,您会习惯于这种方式,但不幸的是,将HTML设计转换为GWT设计始终比将HTML设计转换为JSP页面要慢。


问题:GWT需要一定的理解成本,并且还没有普及。这意味着大多数加入您的团队或维护您的代码的开发人员都必须从头学起。

解决方案:尚不清楚GWT是否会流行起来,但如果您是控制您雇用的人的公司,则始终可以选择知道GWT或想要学习它的人。


问题:与jquery或纯javascript相比,GWT就像一个大锤子。要使其运行,需要进行更多的设置,而只需包含JS文件即可。

解决方案:对于适合于小型简单任务的任务,请使用像jquery这样的库。当您想要在AJAX中构建真正复杂的东西或需要通过RPC机制来回传递数据时,请使用GWT。


问题:有时为了填充您的GWT页面,您需要在页面首次加载时进行服务器调用。用户坐在那里看着加载符号取回所需的数据可能很烦人。

解决方案:对于JSP页面,您的页面在成为HTML之前已由服务器呈现,因此您实际上可以在那时进行所有GWT调用,并将它们预加载到页面上,以实现即时加载。有关详细信息,请参见此处:

通过预序列化您的GWT调用来加速页面加载


我从未遇到过样式我的部件的任何问题,无论是开箱即用,自定义还是其他方式,因此我不知道您所说的是陷阱?

至于性能,我始


1
我们遇到了几个问题,其中各种样式/定位命令似乎没有生效 - 样式没有在应该使用的地方被使用,或者元素的大小似乎忽略了将其设置为100%的请求。同许多常规CSS挑战一样 - 很可能是很多用户错误! - agartzke
1
今年晚些时候将推出许多令人兴奋的新功能,这些功能极大地改善了许多问题。其中包括:进程外托管模式(OOPHM)、CssResource(样式表混淆/缩小)和UiBinder(又称“声明性UI”)。 - Mark Renouf
2
你可以像重用GWT一样重用JQuery,我认为这不是一个有效的论点。它们都支持继承,并且都可以打包进行重用(.jar文件用于GWT,.js文件用于JQuery)。我坚持我的观点,即GWT是一把大锤,你必须使用Java编写它,必须编译它,必须管理更多的东西。但如果你想打破一堵砖墙,那么你就会选择使用这个大锤。这不是一个批评,而是一个有效的观点。选择正确的工具做正确的工作。 - rustyshelf
关于托管/开发模式的性能:最近,Google添加了Super Dev Mode,它提供了一些性能改进。此外,您可以在Chrome开发者工具中为源映射的Java代码设置断点。https://developers.google.com/web-toolkit/articles/superdevmode - frankadelic
在工作中,我们的产品第一次编译至少需要1个小时。我们从头开始重新设计了一切,现在只需要不到2分钟,但旧项目中没有使用任何代码。所以,是的,GWT可以很容易被滥用。 - Jefferson Quesado
显示剩余5条评论

54

我们已经使用GWT工作了将近2年。我们学到了很多教训。以下是我们的看法:

  1. 不要使用第三方小部件库,特别是GWT-EXT。它会破坏您的调试、开发和运行时性能。如果您对此有疑问,请直接联系我。

  2. 只使用GWT填充应用程序的动态部分。因此,如果您有一些具有大量字段的复杂用户交互。但是,不要使用它附带的面板。取出现有的股票设计师提供的页面。切出将包含应用程序控件的区域。将这些控件附加到onModuleLoad()中的页面上。这样,您可以使用来自设计师的标准页面,并在GWT之外进行所有样式设置。

  3. 不要将整个应用程序构建为一个标准页面,然后动态构建所有部分。如果您按照第2项建议做,这种情况就不会发生。如果您动态构建所有内容,将会破坏性能,并消耗大量内存,适用于中型到大型应用程序。此外,如果您按照我的建议做,返回按钮将起作用,搜索引擎索引等也将正常工作。

其他评论者也提出了一些好的建议。我使用的经验法则是创建页面时像制作标准网页一样进行。然后挖掘需要动态的部分。用具有ID的元素替换它们,然后使用RootPanel.get(id).add(widget)来填充这些区域。

我在https://dev59.com/KWLVa4cB1Zd3GeqPvlxc上发布了一个关于你回答的问题。如果您方便的话,能否过目一下,谢谢。 - Elad

20

我们遇到的问题:

  • 虽然你可以使用像 GWT EXT 这样的工具,但每当你使用这种 JavaScript 库的薄层包装时,你就失去了调试的能力。有好几次我因为无法在我的 IntelliJ 调试器中检查 GWT EXT 表格类中发生了什么而头痛不已...你只能看到它是一个 JavaScriptObject。这使得找出问题变得非常困难...

  • 团队中没有懂 CSS 的人。根据我的经验,这个人并不需要是专家...他只需要有一些良好的工作知识,并知道必要时应该搜索哪些术语。

  • 跨浏览器进行调试。关注 Out of Process Hosted Mode[1][2][3],希望在 GWT 1.6 中推出...现在,你只能用 Hosted Mode 得到好的结果,然后使用“Compile/Browse”按钮,在其他浏览器中测试。对于我来说,在 Windows 上工作,这意味着我可以在 FireFox 中查看我的工作,并使用 FireBug 来帮助调整和改进。

  • IE6。令人惊讶的是,IE 6 的渲染方式会有很大不同。我采取了根据浏览器为最外层“视口”应用样式的方法,这样我就可以有像这样的 CSS 规则:

    .my-style { /* stuff that works most everywhere */ }
    
    .msie6 .my-style { /* "override" so that styles work on IE 6 */ }
    
    最后,确保您使用一个能帮助您的编辑器。我使用IntelliJ -- 它有很多GWT智能化的功能。例如,如果我尝试使用一个未被JRE仿真处理的类,它会让我知道;如果我为一个小部件指定了样式,并且我还没有定义该样式,代码就会得到红色波浪线...或者,当查看CSS时,它会告诉我在单个规则中指定了冲突属性。 (我还没有尝试过,但我了解到版本8甚至具有更好的GWT支持,例如将"local"和"async" RPC接口和实现保持同步。)

18

GWT 2.0 预计在接下来的几个月内发布,解决了许多讨论中提到的问题。

  • 使用类似 html/xml 的语法创建布局
  • 动态脚本加载 - 初始只会下载必需的 JS。其余内容将按需下载
  • 浏览器内主机模式 - 这可能会解决所讨论的主机模式速度问题,以及其他好处
  • "编译器优化" - 更快的编译,希望如此

GWT 2.0 在 Google I/O 的预览视频


15

1
两年过去了,这种情况仍然存在。对于在客户端进行日期计算来说仍然非常烦人。 - Joseph Lust
问题是从 java.util.Calendar 到 JavaScript 的翻译(编译)。您还可以查看GWT的类 CalendarUtil如何在GWT中使用java.util.Calendar以及 如何在Java GWT中执行日历操作?如何向日期添加天数?。干杯 ;) - oHo

10

我会在已经提到的要点上再补充一些:

  • 数据绑定/验证。GWT不支持开箱即用的数据绑定和验证,虽然这方面的一些项目开始出现。你会发现自己需要写很多这样的代码:
TextField fname, faddress;
...
fname.setText(person.getName());
faddress.setText(person.getAddress());
...
  • 延迟加载。由于GWT在客户端上运行,因此延迟加载真的不是一个选项。您将需要仔细设计RPC和域对象,以便
    • 发送所需的所有对象数据
    • 避免急切获取全部数据
    • 您还需要确保不发送代理/不可序列化的对象。 hibernate4gwt 可以帮助您解决这些问题。
  • 用户界面设计。使用Java(面板、按钮等)比使用HTML更难以可视化。
  • 历史记录支持。GWT没有附带任何历史子系统,也没有任何用于美化URL或状态式书签的子系统。您必须自己开发(虽然它支持历史令牌(History tokens),这是一个开始)。据我所知,这对所有AJAX工具包都是这样。

在我看来,GWT缺少一个开箱即用支持所有上述问题的框架。


GWT 随附了一个历史系统,例如 History.newItem("myItem", false); 会将 #myItem 放入 URL 中,以便轻松地进行书签标记。要处理某人使用您的应用程序加载书签,请使用 History.addValueChangeHandler(myHandlerMethod)。 - Ztranger
它本身并不是一个历史记录系统,而只是一种将令牌写入URL并处理令牌更改通知的机制。您仍然需要编写所有应用程序代码来处理历史更改。 - Miguel Ping

9
我现在正在开发一个项目,使用的是EXT GWT(GXT),不要与GWT EXT混淆。它们是有区别的,EXT GWT实际上是由编写ExtJS JavaScript库的公司制作的。GWT EXT是围绕ExtJS库的GWT包装器。GXT是本地GWT。
无论如何,GXT仍然有些不成熟,缺乏我认为GWT EXT拥有的强大社区。然而,未来属于GXT,因为它是本地GWT,实际上是由制作ExtJS的公司开发的。由于ExtJS库的许可证已更改,GWT EXT有些受限,从而减缓了其发展速度。
总的来说,我认为GWT/GXT是开发Web应用程序的好解决方案。我实际上非常喜欢开发中的托管模式,它使事情变得快速简单。您还可以获得调试代码的好处。使用JUnit进行单元测试也相当可靠。我还没有看到一个很好的JavaScript单元测试框架,我觉得它足够成熟,可以用于测试企业应用程序。
有关GWT EXT的更多信息: http://gwt-ext.com/

如需了解更多关于EXT GWT(GXT)的信息: http://extjs.com/products/gxt/


1
由于这个问题仍然活跃并且得到了投票,我想提供一个更新。我完全放弃了GXT(2009-2010),因为我不喜欢Sencha Inc的商业做法。然后我随后放弃了GWT。我曾经非常厌恶使用JavaScript,因为我曾经讨厌它。直到我真正理解它之前。现在我几乎只开发Node.js / AngularJS。加入Bootstrap 3,你可以在比GWT更短的时间内制作出一个很棒的网站。未来是JavaScript,你越早接受它,你就会成为更好的开发者。 - JP Richardson
你现在有什么看法?(只是好奇)谢谢。 - Akos Lukacs
1
@AkosLukacs 我仍然可以报告我正在使用JavaScript并且非常喜欢它!就像我说的那样,我曾经讨厌JavaScript,因此选择了GWT。现实情况是,如果您要进行任何Web开发,就无法避免JavaScript,因此您最好接受它。我已经适应了使用JavaScript进行所有事情(稍微偏离了Go)。至于我的技术栈,我使用Node.js / Express / React。我曾经是Angular的忠实粉丝,并且对其非常了解,但我不建议任何从JS开始学习的人使用Angular 1.x,因为学习曲线太高。 - JP Richardson

5
我没有遇到过任何难以轻松克服的主要缺陷。大量使用托管模式。 由于您正在使用GWT-ext,除非您想微调开箱即用外观,否则几乎永远不需要自己修改CSS。 我的建议是在功能接近的情况下,优先使用GWT“本地”小部件而非库小部件。 关于搜索引擎索引:是的,网站通常不会有可导航的URL(除非您只向常规网站元素添加小部件)。但是,您可以执行历史记录前进/后退功能。

4

GWT相当直观和易于理解。

特别是随着UIBinder的发布,允许将GWT小部件以XML形式布局,然后在Java代码中进行编码。

因此,如果您使用过其他Ajax或Flash设计工具,或者Silverlight等,那么学习GWT非常容易。

最大的障碍,如果不是陷阱,就是GWT RPC。您希望使用GWT的原因正是因为GWT异步RPC。否则,为什么不只依赖css来格式化页面呢?

GWT RPC是使服务器刷新数据而无需刷新页面的元素。对于股票表现监测(或美国当前的国家和公共债务,或全球每秒钟流产的胎儿数量)等页面,这是绝对必要的。

理解GWT RPC需要一些努力,但在几个小时内,应该就会明白了。

除此之外,在努力学习GWT RPC之后,您最终会发现,除非...我在我的博客上有一个由8部分(我想)组成的系列文章,介绍如何将JSP用作GWT RPC服务程序。但是,既然您没有要求答案而只是问题,我将停止在此处宣传我的博客。

所以。我非常相信,使用GWT的最大障碍/陷阱是发现如何正确部署GWT异步RPC以及如何使其能够使用JSP服务程序。


我想要你博客文章的链接 ;) - ms-tg
h2g2java.blessedgeek.com - Blessed Geek

4

我之前在一个项目中同时使用了GWT和GWT-ext。相对于Web开发来说,我觉得这个经历非常顺利,但我的建议是:

不要将GWT原生小部件与EXT小部件混合使用。因为它们的名称通常相同(GWT.Button或GWText.Button?),所以会非常令人困惑。

有一件事情发生在我身上,让代码变得比我想象的更加复杂:我想要一个面板,它既能动态更新,又能级联。

GWT原生面板是动态的,而Ext面板是级联的。解决方案呢?用一个GWT.VerticalPanel包装一个GWTExt Panel... 有点混乱,但是它能够工作。 ;)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接