我正处于我们选择使用 GWT 实施的项目的开始/中间。有没有人在使用 GWT(和 GWT-EXT)时遇到任何无法克服的重大陷阱?从性能的角度来看呢?
我们已经看到/听到的一些事情包括:
- 谷歌无法索引内容
- 总体而言,CSS 和样式似乎有点不稳定
也在寻找有关这些项目的任何其他反馈。谢谢!
我首先要说我是 GWT 的忠实粉丝,但是确实有很多陷阱,但我们能够克服的大部分(如果不是全部的话):
问题:编译时间长,随着项目的增长,编译所需的时间也会增加。我听说过 20 分钟编译的报告,但我的平均大约 1 分钟。
解决方案:将您的代码拆分为单独的模块,并告诉 ant 仅在更改时才构建它。此外,在开发过程中,您可以通过只为一个浏览器构建来大大加快编译时间。您可以通过将其放入 .gwt.xml 文件来执行此操作:
<set-property name="user.agent" value="gecko1_8" />
其中 gecko1_8 是 Firefox 2+,ie6 是 IE,等等。
问题:托管模式非常慢(至少在 OS X 上),并且与您在编辑 JSP 或 Rails 页面等内容并在浏览器中点击刷新时获得的“实时”更改不匹配。
解决方案:您可以为托管模式提供更多内存(我通常为 512M),但它仍然很慢,我发现一旦您对 GWT 足够好就停止使用它。您进行了大量更改,然后仅针对一个浏览器进行编译(通常需要 20 秒的编译时间),然后只需在浏览器中点击刷新即可。
更新:使用 GWT 2.0+ 这不再是问题,因为您使用新的“开发模式”。这基本上意味着您可以直接在您选择的浏览器中运行代码,因此不会损失速度,而且您可以触发/检查它等。
http://code.google.com/p/google-web-toolkit/wiki/UsingOOPHM
问题: GWT 代码是 java,与布局 HTML 页面有不同的心态,这使得采用 HTML 设计并将其转换为 GWT 更加困难
解决方案:您再次习惯了这一点,但不幸的是,将 HTML 设计转换为 GWT 设计总是比将 HTML 设计转换为 JSP 页面之类的操作要慢。
问题: GWT 需要一些时间来了解,并且还不是主流。这意味着大多数加入您的团队或维护您的代码的开发人员必须从头开始学习
解决方案: GWT 是否会起飞还有待观察,但如果您是一家可以控制招聘人员的公司,那么您始终可以选择了解 GWT 或想学习 GWT 的人。
问题:与 jquery 或纯 javascript 之类的东西相比,GWT 是一把大锤。实现它需要更多的设置,而不仅仅是包含一个 JS 文件。
解决方案:将 jquery 之类的库用于适合这些的更小、更简单的任务。如果您想在 AJAX 中构建真正复杂的东西,或者您需要通过 RPC 机制来回传递数据,请使用 GWT。
问题:有时为了填充您的 GWT 页面,您需要在页面首次加载时进行服务器调用。当您获取所需数据时,用户坐在那里观看加载符号可能会很烦人。
解决方案:在 JSP 页面的情况下,您的页面在成为 HTML 之前已经由服务器呈现,因此您实际上可以进行所有 GWT 调用,并将它们预加载到页面上,以便即时加载。有关详细信息,请参见此处:
我从来没有遇到任何问题 CSS 样式我的小部件,开箱即用,自定义或其他,所以我不知道你的意思是这是一个陷阱?
至于性能,我一直发现编译后的 GWT 代码很快,而且 AJAX 调用几乎总是比整个页面刷新要小,但这并不是 GWT 真正独有的,尽管如果你使用本机 RPC 数据包,你会得到一个 JAVA 后端非常紧凑。
我们已经与 gwt 合作了将近 2 年。我们吸取了很多教训。以下是我们的想法:
不要使用第三方小部件库,尤其是 gwt-ext。它会扼杀您的调试、开发和运行时性能。如果您对这是如何发生的有疑问,请直接与我联系。
使用 gwt 仅填写应用程序的动态部分。因此,如果您有一些涉及大量字段的复杂用户交互。但是,请勿使用随附的面板。以您现有的库存设计师提供的页面为例。划出将包含应用程序控件的区域。在 onModuleLoad() 中将这些控件附加到页面。通过这种方式,您可以使用设计师的标准页面,也可以在 gwt 之外进行所有样式设置。
不要将整个应用程序构建为一个标准页面,然后动态构建所有部分。如果您按照我在第 2 项中的建议进行操作,无论如何都不会发生这种情况。如果您动态构建所有内容,您将降低性能并为大中型应用程序消耗大量内存。另外,如果你按照我的建议去做,后退按钮会很好用,搜索引擎索引等也会很好用。
其他评论者也提出了一些很好的建议。我使用的经验法则是像创建标准网页一样创建页面。然后雕刻出需要动态的部分。将它们替换为具有 id 的元素,然后用于RootPanel.get( id ).add( widget )
填充这些区域。
我们遇到的陷阱:
虽然您可以从使用 GWT EXT 之类的东西中获得很多好处,但任何时候您在 JavaScript 库之上使用这种薄薄的单板,您就失去了调试的能力。不止一次我把头撞在桌子上,因为我无法检查(在我的 IntelliJ 调试器中)GWT EXT 表类中发生了什么......你所看到的只是它是一个 JavaScriptObject。这使得很难弄清楚出了什么问题......
团队中没有了解 CSS 的人。根据我的经验,这个人不是专家并不重要......只要他有一些良好的工作知识,并且在必要时知道谷歌的正确术语就足够了。
跨浏览器调试。密切关注进程外托管模式[ 1 ][ 2 ][ 3 ],希望在 GWT 1.6 中出现……现在,您只需使用托管模式,然后使用“编译/浏览”按钮,您可以在其中与其他浏览器一起玩。对我来说,在 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 支持,例如保持“本地”和“异步”RPC 接口和实现同步。)
GWT 2.0 预计将在未来几个月内发布,它解决了许多讨论的问题。
不是“无法克服”,而是对一些基本的东西有点痛苦。
日期处理:
GWT 使用 deprecated java.util.Date
,这可能会在客户端处理日期时导致意外行为。java.util.Calendar
GWT 不支持。更多信息在这里。
相关问题示例:
我将在已经提到的基础上添加一些要点:
文本字段 fname,faddress; ... fname.setText(person.getName()); faddress.setText(person.getAddress()); ...
恕我直言,GWT 缺少一个对该“线程”中提到的所有问题提供开箱即用支持的框架。
我现在正在做一个项目,它使用 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 EXT 的开发。
总的来说,我认为 GWT/GXT 是开发 Web 应用程序的一个很好的解决方案。实际上,我非常喜欢托管模式进行开发,它使事情变得快速而简单。您还可以获得能够调试代码的好处。使用 JUnit 进行单元测试也非常可靠。我还没有看到一个很棒的 JavaScript 单元测试框架,我觉得它足够成熟,可以测试企业应用程序。
有关 GWT EXT 的更多信息:http: //gwt-ext.com/
有关 EXT GWT (GXT) 的更多信息:http: //extjs.com/products/gxt/
没有我无法轻松克服的重大陷阱。大量使用托管模式。当您使用 GWT-ext 时,您几乎不需要自己接触 CSS,除非您想调整开箱即用的外观。
我的建议是在功能接近的库上使用 GWT“本机”小部件。
重新搜索引擎索引:是的,该站点通常不会有可导航的 URL(除非您只是将小部件添加到常规网站的元素中)。不过,您可以执行历史回退/转发功能。
前段时间我在一个项目中同时使用了 GWT 和 GWT-ext。随着 Web 开发的进行,我发现体验非常顺畅,但我的建议是:
不要将 GWT 本机小部件与 EXT 小部件混合使用。这令人困惑,因为通常名称是相同的(GWT.Button 或 GWText.Button?)
发生在我身上的一件事确实使代码比我想要的更复杂,那就是我想要一个面板,它 a) 可动态更新 b) 可级联
GWT 原生面板是动态的,Ext 面板是可级联的。解决方案?一个 GWT.VerticalPanel 包装了一个 GWText 面板......混乱。:)
但是,嘿,它有效。;)
我赞同 ykagano 的评论,最大的缺点是在 MVC 中丢失了 V。尽管您可以将真正的 ui 类与客户端代码的其余部分分开,但您不能轻松地使用由图形/网页设计师生成的 HTML 页面。这意味着您需要开发人员将 HTML 翻译成 java。
获得一个所见即所得的 ui 编辑器,它将为您节省大量时间。我使用 GWTDesigner。
GWT 最大的好处是能够忘记跨浏览器问题。它不是100%,但几乎消除了所有痛苦。结合托管模式调试的优势(与 Firebug 相比,Firebug 非常出色但与 java 调试器不同),它为开发人员在生成复杂的 ajax 应用程序方面提供了巨大的优势。
哦,它在运行时很快,特别是如果你使用 gzip 过滤器。
有点题外话,但 irc 上的#gwt 频道非常有帮助,以防万一您遇到问题。
GWT 非常简单直观。
特别是随着 UIBinder 的发布,它允许 GWT 小部件以 XML 布局,然后在 Java 中进行编码。
所以如果你用过其他的Ajax或者Flash设计工具,或者Silverlight等,GWT是非常容易学习的。
主要障碍(如果不是陷阱)是 GWT RPC。您希望使用 GWT 的真正原因是因为 GWT 异步 RPC。否则,为什么不只依靠 css 来格式化你的页面呢?
GWT RPC 是允许服务器刷新服务器上的数据而无需刷新页面的元素。这是对股票表现监控(或美国当前的国家和公共债务或世界范围内流产的未出生婴儿数量)等页面的绝对要求。
GWT RPC 需要一些努力才能理解,但只要几个小时,就应该清楚了。
除此之外,在努力学习 GWT RPC 之后,你终于发现你不能使用 JSP 作为 RPC 的服务组件,除非......我的博客上有一个 8 部分(我认为)系列关于如何使用 JSP作为 GWT RPC 服务者。但是,由于您没有要求答案,而只是提出问题,因此我将停止为我的博客做广告。
所以。我非常相信使用 GWT 的最大障碍/陷阱是找出如何正确部署 GWT 异步 RPC 以及如何使其能够使用 JSP 服务。
我们很难将我们的 GWT 代码库与我们从网页设计师那里获得的 HTML Web 模板(我们希望 GWT 管理的具有特定 div id 的静态 HTML 页面)结合起来。至少在我们使用它的时候,我们无法让 GWT 与我们网站中未使用 GWT 编码的部分集成。我们最终让它工作了,但这是一个很大的黑客攻击。
但对于大型 Javascript 项目,它是最佳选择
GWT 2.4 已经修复了许多上述问题,并且一个很棒的小部件库刚刚从 Beta 版(Ext GWT 3.0.4 aka GXT)中出来,它完全用 GWT 编写,而不是 JS 库的包装器。
剩余疼痛:
关于 GWT 2.4,调试 GWT 时使用 Firefox,它比使用 chrome 快得多。如果您只使用 firefox,请考虑将此行放在您的project.gwt.xml文件中
<set-property name="user.agent" value="gecko1_8" />
此外,如果您使用的是 eclipse,请在 arguments -> VM arguments 下添加以下内容:
-Xmx512m -XX:MaxPermSize=1024m -XX:PermSize=1024m
您可以划分服务器和客户端,并在 arguments -> Program arguments 下使用以下内容: -codeServerPort 9997 -startupUrl http://yourserver/project -noserver
此外,为了防止在每次更改时刷新服务器,请使用 JRebel http://zeroturnaround.com/blog/how-to-rock-out-with-jrebel-and-google-web-toolkit-gwt/ 这是一个现场演示 http://www.youtube.com/watch?feature=player_embedded&v=4JGGFCzspaY
一个主要的缺陷是,有时您需要显式地为最终成为 HTML 元素的内容分配一个 id,以便能够使用某些 CSS 样式。例如:当 tabPanel 的 tabBar 被分配了一个 id 并且您在该 elementId 上指定了一个 :hover 时,GWT TabPanel 只会在 tabBarItems 上执行 :hover。
我在其他地方写过GWT 的其他一些缺点,但它们已经被 rustyshelfs 回答:)。
我最近在 GWT 上做了很多工作,这就是我不得不说的:
我对 GWT-EXT 了解不多,但我也相信没有必要包含第三方库。
祝你的决定好运:)
GWT 进行浏览器嗅探而不是特征检测,您的应用程序将无法在某些浏览器上运行(特别是新浏览器)
以下是该问题的一些参考:
以下是对特征检测的一些参考:
GWT 团队对去年发布的 GWT 2.7 做了很多重大改进。GWT 的一个主要弱点是在 GWT 2.6 及更低版本中编译需要很长时间。现在已经没有了 GWT 没有增量编译,它超级快并且只编译更改。
GWT 2.7 现在有(来源):
获得可靠事实的最佳方法是通过gwt 调查。GWT 的最大问题之一一直是编译时间过长。幸运的是,它正在迅速改善,因此在不久的将来它不会成为一个重大问题。另一个陷阱是 GWT 要复杂得多,因为 Java 是一种更复杂的语言,可以在每一步都抵制糟糕的编码人员。另外,编译增加了一层。例如,js 互操作需要一些样板文件。根本问题是 GWT 的设计并不简单。它是为极其复杂的 Web 应用程序从头开始设计的,整个社区始终将性能、代码质量、架构等优先于简单编码。
请记住,您可以随时在 GWT 中使用 js,因此如果您在 GWT 中遇到困难,请考虑使用 js。归根结底,GWT 就是 js,所以你可以在 GWT 中做任何你可以在 js 中做的事情。事实上,大多数 GWT 项目都使用 js。问题是 GWT 要复杂得多。然而,有时额外的复杂性是值得的。
值得注意的是,GWT 3.0 将带来巨大的改进。
重用 RPC 服务对象。
它会导致竞争条件看起来像应用程序挂起。
我遇到的陷阱 1. superdev 模式下的不同行为。例如 Someclass.class.getName() 在 Superdev 模式下工作得非常好,并返回类的完全限定名。在生产模式下,这不起作用。
GWT 是技术杰作。它将客户端和服务器编程结合在一起,使其成为一个连贯的应用程序——软件在“分层”之前的编写方式,以及它应该被编写的方式。它消除了不同的技能组合、团队成员之间的沟通不畅,以及整个网页设计阶段:艺术和编程。它是最接近移动设备的地方,例如 Android 开发。事实上,GWT 旨在生成不同的原生 UI,而不仅仅是 HTML。虽然它需要大量的纪律来确保这种解耦——保持你的内层与表示无关。
你应该避免的第一个错误,我花了四年时间才意识到,是使用第三方扩展,如 EXT-GWT aka GXT 和 SmartGWT。开始使用他们漂亮的桌面小部件而不是投资自己的样式是非常诱人的,但是直到我终于厌倦了,我才知道我在使用 SmartGWT 时遇到了多少问题。简而言之,它将核心 GWT 功能集冻结在某个(相当过时的)级别,然后在它之上构建。还要记住,如今轮廓分明的桌面外观和感觉看起来很傻,更不用说性能低下、大量错误和兼容性功能——尤其是在移动设备上。您希望尽可能接近原生浏览器控件,即呈现为原生 <select> 元素的下拉菜单,而不是一些自定义绘制的控件。
由于移动趋势,整个用户体验变得更加简单和扁平,因此您不需要做太多的事情来设计一个外观清晰的应用程序。虽然如果你想要“3D”外观,也有渐变。CSS3 让一切变得简单,GWT 以一种优雅的面向对象的方式包装它,这与原始 CSS 不同。因此,不要因为在 GWT Showcase 中看到相当丑陋的准系统控件而气馁。GWT 团队故意不提供任何样式,因为这是开发人员的工作。
剩下的就是用漂亮简洁的 API 用强类型 Java 编写的非常传统的浏览器编程。但是当然永远不要忘记你的代码在浏览器中运行,所以所有的调用都是异步的,例如你不能在一个循环中调用 GWT-RPC 方法(填充一些列表),但是如果你遇到过这个问题,需要递归地链接它们情况。
有一些自称的“反模式”,比如不使用 GWT-RPC。到目前为止,这对我来说一直很好:10 年了。简单是关键。我不会考虑为了代码的优雅和可维护性而牺牲一些边际性能。除此之外,这不是您的瓶颈所在 - 在数据库中。当然要注意您向客户端发送了多少数据。
如果您无法找到现有的小工具或为其设置样式 - 阅读丰富的 HTML5 元素集,您可以随时包装第三方的。我用流行的 jQuery FullCalendar 做到了。根本不是火箭科学。像谷歌地图和谷歌图表这样的其他东西都有半官方的 GWT 包装器。
GWT 是完美的。它没有得到足够喜爱的唯一原因是,仍然影响该行业的早期互联网采用者并非来自计算机科学和面向对象的语言来欣赏它们。他们有艺术(Photoshop/WordPress)或网络(Perl/Python)背景。