最大的GWT陷阱?

时间:2008-09-19 05:23:58

标签: java ajax gwt gwt-ext

我正处于我们选择使用GWT实施的项目的开头/中间。有没有人遇到过使用无法克服的GWT(和GWT-EXT)的任何重大陷阱?从绩效角度来看怎么样?

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

  • Google无法索引内容
  • CSS和造型一般似乎有点不稳定

寻找有关这些项目的任何其他反馈。谢谢!

24 个答案:

答案 0 :(得分:231)

我首先要说的是,我是一个巨大的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足够好就停止使用它。您进行了大量更改,然后只编译一个浏览器(通常为20s的编译),然后在浏览器中点击刷新。

更新:使用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或想要的人学习它。


问题:与jquery或简单的javascript相比,GWT是一个大锤。它需要更多的设置来实现它,而不仅仅是包含一个JS文件。

解决方案:使用类似jquery的库来处理适合这些的较小,简单的任务。如果您想在AJAX中构建真正复杂的东西,或者需要通过RPC机制来回传递数据,请使用GWT。


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

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

Speed up Page Loading by pre-serializing your GWT calls


我从来没有遇到任何问题CSS样式我的小部件,开箱即用,定制或其他,所以我不知道你的意思是什么是一个陷阱?

至于性能,我总是发现,一旦编译好的GWT代码很快,并且AJAX调用几乎总是小于整页刷新,但这并不是GWT独有的,尽管你得到的本机RPC数据包如果你使用JAVA后端非常紧凑。

答案 1 :(得分:54)

我们与gwt合作已近2年。我们学到了很多东西。以下是我们的想法:

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

  2. 使用gwt仅填写应用的动态部分。因此,如果您与许多字段进行了一些复杂的用户交互。但是,请勿使用随附的面板。拿现有的库存设计师提供的页面。划出包含应用程序控件的区域。将这些控件附加到onModuleLoad()中的页面。这样您就可以使用设计师的标准页面,并在gwt外部进行所有样式设计。

  3. 不要将整个应用程序构建为一个标准页面,然后动态构建所有部分。如果你按照我在第2项中的建议行事,那么无论如何都不会发生这种情况。如果你动态地构建所有内容,你将会破坏性能并为大中型应用程序消耗大量内存。此外,如果您按照我的建议行事,后退按钮将运行良好,搜索引擎索引也将如此。

  4. 其他评论者也提出了一些很好的建议。我使用的经验法则是创建像您正在做标准网页的页面。然后分割出需要动态的碎片。将它们替换为具有id的元素,然后使用RootPanel.get( id ).add( widget )填充这些区域。

答案 2 :(得分:20)

我们遇到的陷阱:

  • 虽然使用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接口和实现同步。)

答案 3 :(得分:18)

GWT 2.0,应该在未来几个月的某个时间出现,解决了很多讨论的问题。

  • 使用类似html / xml的语法
  • 创建布局
  • 动态脚本加载 - 最初只下载基本的JS。其余的将根据需要下载
  • 浏览器内托管模式 - 这可能会解决所讨论的托管模式速度问题以及其他好处
  • “编译器优化” - 编译速度更快,希望

GWT 2.0 Preview Video at Google I/O

答案 4 :(得分:15)

不是“无法克服”,而是对某些基本的东西感到痛苦。

日期处理:

GWT使用弃用的java.util.Date,这可能会导致在客户端处理日期时出现意外行为。 GWT不支持java.util.CalendarMore info here

相关问题示例:

答案 5 :(得分:10)

我会在已经提到的内容中添加一些要点:

  • 数据绑定/验证。 GWT没有开箱即用的数据绑定/验证支持,尽管该领域的一些项目开始出现。你会发现自己写的很多:
TextField fname, faddress;
...
fname.setText(person.getName());
faddress.setText(person.getAddress());
...
  • 延迟加载。由于gwt在客户端,因此延迟加载实际上不是一种选择。您必须仔细设计RPC和域对象
    • 发送所有需要的对象数据
    • 避免急于提取所有数据
    • 您还必须确保不会发送代理/非可序列化对象。 hibernate4gwt可以帮助您解决这些问题。
  • UI设计。在java(面板,按钮等)中比在html中可视化UI更难。
  • 历史支持。 GWT不附带历史子系统,也不附带任何子系统以获取良好的URL或状态书签。你必须自己动手(尽管它支持历史令牌,这是一个开始)。所有AJAX工具包AFAIK都会发生这种情况。

恕我直言,GWT缺少一个框架,该框架对此“线程”中提到的所有问题提供开箱即用的支持。

答案 6 :(得分: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 EXT的开发。

总的来说,我认为GWT / GXT是开发Web应用程序的好方法。我实际上非常喜欢托管模式进行开发,它使事情变得简单快捷。您还可以获得调试代码的好处。使用JUnit进行单元测试也非常可靠。我还没有看到一个伟大的JavaScript单元测试框架,我觉得它已经足够成熟,可用于测试企业应用程序。

有关GWT EXT的更多信息: http://gwt-ext.com/

有关EXT GWT(GXT)的更多信息: http://extjs.com/products/gxt/

答案 7 :(得分:5)

没有一个我无法轻易克服的重大陷阱。大量使用托管模式。 当你使用GWT-ext时,你几乎不需要自己触摸CSS,除非你想调整开箱即用的外观。

我的建议是在功能接近的库中使用GWT“原生”小部件。

重新搜索引擎索引:是的,该网站通常没有可导航的网址(除非您只是将小部件添加到常规网站的元素)。您可以执行历史记录后退/转发功能。

答案 8 :(得分:4)

我是ykagano的评论,最大的劣势是在MVC中输掉了V.虽然您可以将真正的ui类与其他客户端代码分开,但您无法轻松使用图形/ Web设计器生成的HTML页面。这意味着您需要开发人员将HTML转换为java。

获取一个wysiwyg ui编辑器,它将为您节省大量时间。我使用GWTDesigner。

GWT的最大优势是能够忘记跨浏览器问题。它不是百分之百,但几乎消除了所有的痛苦。结合托管模式调试的好处(与Firebug相比,它非常出色但与java调试器不同),它为开发人员提供了生成复杂的ajax应用程序的巨大优势。

哦,它在运行时很快,特别是如果你使用gzip过滤器。

答案 9 :(得分:4)

稍微偏离主题,但irc上的#gwt频道非常有用,以防你遇到持续存在的问题。

答案 10 :(得分:4)

前一段时间我在一个项目中使用了GWT和GWT-ext。随着网络开发的进行,我发现这种体验非常顺利,但我的建议是:

不要将GWT本机窗口小部件与EXT窗口小部件混合使用。它太混乱了,因为通常名字是相同的(GWT.Button或GWText.Button?)

发生在我身上的一件事真的让代码变得比我想要的更复杂,那就是我想要一个面板 a)动态可更新 b)cascadable

GWT原生面板是动态的,Ext面板是可级联的。解?包含GWTExt面板的GWT.VerticalPanel ...混乱。 :)

但是,嘿,它有效。 ;)

答案 11 :(得分:4)

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服务器。

答案 12 :(得分:3)

我们很难将GWT代码库与我们从网页设计师那里获得的HTML网页模板结合起来(我们希望GWT管理的具有特定div的静态HTML页面)。至少在我们使用它时,我们无法将GWT与我们网站中未用GWT编码的部分集成。我们最终有了它的工作,但这是一个很大的黑客。

答案 13 :(得分:3)

  • 您必须为每个服务接口编写的Async接口看起来像是由GWT编译器自动生成的。
  • 大型项目的编译时间变长

但对于大型Javascript项目来说,这是最好的选择

答案 14 :(得分:3)

GWT 2.4修复了上述许多问题,而一个出色的小部件库刚刚推出Beta(Ext GWT 3.0.4又名GXT),它完全用GWT编写,而不是JS库的包装。

剩下的疼痛:

  • 缺少CSS3选择器支持,在某些情况下可以使用“literal()”来解决它。
  • 缺乏对CSS3和现代浏览器事件的支持,例如 transitionEnd
  • 缺乏Java Calendar类支持(许多年后)。
  • 缺乏JUnit4支持(5年及计数)。
  • Google GWT团队缺乏明确的路线图和发布时间表。

答案 15 :(得分:2)

关于GWT 2.4,使用Firefox 调试GWT时,它比使用chrome更快。 如果您只使用firefox,请考虑将此行放在 project.gwt.xml 文件中

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

此外,如果您正在使用eclipse,请在参数下添加以下内容 - &gt; VM参数:

-Xmx512m -XX:MaxPermSize = 1024m -XX:PermSize = 1024m

您可以划分服务器和客户端,并在参数下使用以下内容 - &gt;程序参数: -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

答案 16 :(得分:1)

我最近在GWT上做了很多工作,这就是我要说的:

  1. CSS样式有时候很棘手,使用IE中的IE开发者工具和Firefox中的firebug来弄清楚到底发生了什么,你会清楚地知道需要改变哪些css
  2. 您可以使用技巧让谷歌为其编制索引。一个非常着名的网站http://examples.roughian.com/检查谷歌的评级。一个不那么着名的网站是www.salvin.in(无法拒绝提及),我将其优化为单词:salvin主页(搜索google这三个单词)
  3. 我对GWT-EXT了解不多,但我也相信不需要包含第三方库。

    祝你好运:)

答案 17 :(得分:1)

GWT团队在去年发布GWT 2.7方面取得了很大的进步。 GWT的一个主要缺点是编译需要花费很多时间在GWT 2.6及以下。现在已经过去GWT没有增量编译,这是超快速的,只编译变化。

GWT 2.7现在有(Source):

  • 增量版本现在只需几秒钟
  • 更紧凑,更准确的SourceMaps
  • GSS支持
  • JSInterop
  • 出色的JavaScript性能
  • 较小的代码大小

答案 18 :(得分:1)

获得可靠事实的最佳方式来自gwt survey。 GWT最大的问题之一就是编译时间很长。幸运的是,它的改进非常迅速,所以它在不久的将来不会成为一个重大问题。另一个缺陷是GWT变得非常复杂,因为Java是一种更复杂的语言,可以在每一步中抵御坏人。另外,编译会添加一个图层。例如,js interop需要一些样板。根本问题是GWT的设计并不简单。它是为极其复杂的Web应用程序而设计的,整个社区始终优先考虑,性能,代码质量,架构等,而不是简单的编码。
     请记住,您可以随时在GWT中使用js,因此如果您正在努力使用GWT,请考虑使用js。在一天结束时,GWT是js所以你可以用js中的GWT做任何事情。实际上,大多数GWT项目都使用js。问题是GWT非常复杂。然而,它有时值得额外的复杂性。

值得注意的是GWT 3.0将带来巨大的改进。

答案 19 :(得分:1)

答案 20 :(得分:1)

一个主要的缺陷是,有时你需要明确地为最终成为HTML元素的id分配id才能使用某些CSS样式。例如:GWT TabPanel将只执行以下操作:当tabPanel的tabBar已分配id并且您在该elementId上指定:hover时,将鼠标悬停在tabBarItems上。

我在其他地方写过其他一些disadvantages of GWT,但是他们已经被rustyshelfs回答:)。

答案 21 :(得分:0)

陷入困境我遇到了 1. superdev模式下的不同行为。例如。 Someclass.class.getName()在Superdev模式下工作正常,并返回类的完全限定名称。在生产模式下,这不起作用。

  1. addWidget(widget)将调用widget的removefromparent()

答案 22 :(得分:0)

重新使用RPC服务对象 它会导致竞争条件看起来像应用程序挂起的症状。

答案 23 :(得分:0)

GWT是一项技术杰作。它将客户端和服务器编程结合在一起,使其成为一个连贯的应用程序 - 软件在“分层”之前编写的方式,以及应该编写的方式。它消除了不同的技能组合,团队成员之间的沟通错误,以及整个网页设计阶段:艺术和编程。它是最接近移动设备的,例如Android开发。事实上,GWT旨在生成不同的本机UI,而不仅仅是HTML。虽然它需要巨大的纪律来确保这种脱钩 - 保持你的内层表现不可知。

你应该避免的第一个错误,我花了四年才意识到,正在使用像EXT-GWT又名GXT和SmartGWT这样的第三方扩展。开始使用他们漂亮的桌面小部件而不是投资你自己的造型是非常诱人的,但我不知道在我最终厌倦之前我有多少与SmartGWT有关的问题。简而言之,它冻结了某个(相当过时的)级别的核心GWT功能集,然后构建在它之上。还要记住,现在这种轮廓分明的桌面外观看起来很愚蠢,更不用说性能低下,大量漏洞和兼容性功能 - 特别是在移动设备上。您希望保持尽可能接近本机浏览器控件,即呈现为本机&lt; select&gt;的下拉列表。元素,而不是一些自定义绘制的控件。

由于移动趋势,整个用户体验变得越来越简单和平坦,所以你不需要做太多的事情来设计一个外观漂亮的应用程序。虽然如果你想要“3D”外观,也有渐变。 CSS3使一切变得简单,并且GWT以优雅的面向对象的方式包装它,与原始CSS不同。所以不要因为在GWT Showcase中看到相当难看的准系统控制而气馁。 GWT团队故意不提供任何样式,因为它是开发人员的工作。

其余的几乎是传统的强类型Java浏览器编程,具有漂亮的简洁API。但是当然永远不会忘记你的代码在浏览器中运行,所以所有的调用都是异步的,例如你不能在一个循环中调用GWT-RPC方法(填充一些列表),但如果你遇到这种情况,需要递归链接它们。

有一些自称“反模式”就像不使用GWT-RPC一样。到目前为止,对我来说一直很好:10年。简单是关键。我甚至不会想到为代码优雅和可维护性牺牲一些边际性能。此外,这不是你的瓶颈所在 - 在数据库中。当然要记住你发送给客户端的数据量。

如果您无法找到或设置现有小工具的样式 - 阅读丰富的HTML5元素集,您始终可以包装第三方元素。我用流行的jQuery FullCalendar做到了。根本不是火箭科学。谷歌地图和谷歌图表等其他所有内容都有半官方的GWT包装。

GWT非常完美。它没有获得足够的爱的唯一原因是因为仍然影响该行业的早期互联网采用者并非来自计算机科学和面向对象的语言来欣赏它们。他们有艺术(Photoshop / WordPress)或网络(Perl / Python)背景。