我目前正在使用GWT实现一个项目的开发,是否有人在使用GWT(和GWT-EXT)时遇到了无法克服的主要问题?从性能角度来看呢?
我们已经看到/听到的一些事情包括:
- 谷歌不能够索引内容
- CSS和样式方面似乎有点不稳定
同时也希望得到关于这些问题的额外反馈。谢谢!
我目前正在使用GWT实现一个项目的开发,是否有人在使用GWT(和GWT-EXT)时遇到了无法克服的主要问题?从性能角度来看呢?
我们已经看到/听到的一些事情包括:
同时也希望得到关于这些问题的额外反馈。谢谢!
我首先要说的是,我是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工作了将近2年。我们学到了很多教训。以下是我们的看法:
不要使用第三方小部件库,特别是GWT-EXT。它会破坏您的调试、开发和运行时性能。如果您对此有疑问,请直接联系我。
只使用GWT填充应用程序的动态部分。因此,如果您有一些具有大量字段的复杂用户交互。但是,不要使用它附带的面板。取出现有的股票设计师提供的页面。切出将包含应用程序控件的区域。将这些控件附加到onModuleLoad()中的页面上。这样,您可以使用来自设计师的标准页面,并在GWT之外进行所有样式设置。
不要将整个应用程序构建为一个标准页面,然后动态构建所有部分。如果您按照第2项建议做,这种情况就不会发生。如果您动态构建所有内容,将会破坏性能,并消耗大量内存,适用于中型到大型应用程序。此外,如果您按照我的建议做,返回按钮将起作用,搜索引擎索引等也将正常工作。
RootPanel.get(id).add(widget)
来填充这些区域。我们遇到的问题:
虽然你可以使用像 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接口和实现保持同步。)GWT 2.0 预计在接下来的几个月内发布,解决了许多讨论中提到的问题。
并非“无法克服”,但对于基本操作有点麻烦。
日期处理:
GWT使用了已被弃用的java.util.Date
,这可能会导致在客户端处理日期时出现意外情况。GWT不支持java.util.Calendar
。此处有更多信息。
相关问题示例:
java.util.Calendar
到 JavaScript 的翻译(编译)。您还可以查看GWT的类 CalendarUtil
,如何在GWT中使用java.util.Calendar以及 如何在Java GWT中执行日历操作?如何向日期添加天数?。干杯 ;) - oHo我会在已经提到的要点上再补充一些:
TextField fname, faddress; ... fname.setText(person.getName()); faddress.setText(person.getAddress()); ...
在我看来,GWT缺少一个开箱即用支持所有上述问题的框架。
如需了解更多关于EXT GWT(GXT)的信息: http://extjs.com/products/gxt/
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服务程序。
我之前在一个项目中同时使用了GWT和GWT-ext。相对于Web开发来说,我觉得这个经历非常顺利,但我的建议是:
不要将GWT原生小部件与EXT小部件混合使用。因为它们的名称通常相同(GWT.Button或GWText.Button?),所以会非常令人困惑。
有一件事情发生在我身上,让代码变得比我想象的更加复杂:我想要一个面板,它既能动态更新,又能级联。
GWT原生面板是动态的,而Ext面板是级联的。解决方案呢?用一个GWT.VerticalPanel包装一个GWTExt Panel... 有点混乱,但是它能够工作。 ;)