最大的GWT陷阱?

时间:2020-03-06 14:24:48  来源:igfitidea点击:

我处于我们选择使用GWT实施的项目的开始/中期。是否有人在使用GWT(和GWT-EXT)时遇到无法克服的重大陷阱?从性能角度来看如何?

我们已经看到/听到的几件事已经包括:

  • Google无法将内容编入索引
  • 一般而言,CSS和样式似乎有些不稳定

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

解决方案

没有我无法轻松克服的重大陷阱。大量使用托管模式。
当我们使用GWT-ext时,我们几乎不需要自己接触CSS,除非我们想要调整现成的外观。

我的建议是在库中使用GWT的"本机"窗口小部件,这些窗口部件在功能上很接近。

重新搜索引擎索引编制:是的,站点通常不会具有可导航的URL(除非我们仅将窗口小部件添加到常规网站的元素中)。但是,我们可以执行历史记录后退/转发功能。

首先,我是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调用,并将它们预加载到页面上以进行即时加载。详细信息请参见此处:

通过预序列化GWT调用来加快页面加载速度

我从来没有遇到过CSS样式化小部件(无论是开箱即用,自定义还是其他方式)的问题,所以我不知道这是一个陷阱吗?

至于性能,我总是发现,一旦编译的GWT代码很快,并且AJAX调用几乎总是比刷新整个页面小,但这并不是GWT真正独特的,尽管如果使用JAVA后端非常紧凑。

一个主要的陷阱是,有时我们需要为最终成为HTML元素的对象显式分配一个ID,以便能够使用某些CSS样式。例如:当给tabPanel的tabBar分配了ID并在那个elementId上指定了:hover时,GWT TabPanel只会将:hover停在tabBarItems上。

我在其他地方写了关于GWT的其他一些缺点,但是这些问题已经在rustyshelfs答案中解决了:)。

不久前,我在一个项目中同时使用了GWT和GWT-ext。随着Web开发的进行,我发现体验相当流畅,但是我的建议是:

不要将GWT本机窗口小部件与EXT小部件混合使用。令人困惑,因为通常名称是相同的(GWT.Button或者GWText.Button?)

我发生的一件事实际上使代码比我想要的更加复杂,是我想要一个面板,
a)动态可更新
b)级联

GWT本机面板是动态的,而Ext面板是可级联的。解决方案?包裹GWTExt面板的GWT.VerticalPanel ...混乱。 :)

但是,嘿,它有效。 ;)

我现在正在开发一个项目,该项目使用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之类的东西可以使我们受益匪浅,但是只要我们在JavaScript库之上使用这种薄胶合板,就会失去调试能力。我不止一次地把头砸在桌子上,因为我无法检查(在IntelliJ调试器内部)GWT EXT表类中发生了什么……我们所看到的只是它是一个JavaScriptObject。这使得很难找出出了什么问题...
  • 团队中没有知道CSS的人。根据我的经验,该人不是专家也没关系...只要他具有一些良好的工作知识,并且在必要时知道适用于Google的正确术语就足够了。
  • 跨浏览器调试。密切注意进程外托管模式[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代码库与从Web设计人员那里获得的HTML Web模板相结合(我们希望GWT管理具有特定div ID的静态HTML页面)。至少在使用它时,我们无法使GWT与我们网站中未使用GWT编码的部分集成。我们最终使它工作了,但这是一个很大的漏洞。

我第二次接受ykagano的评论,最大的缺点是失去了MVC中的V。尽管我们可以将真正的ui类与其余的客户端代码分开,但是我们不能轻易使用由图形/网页设计师生成的HTML页面。这意味着我们需要开发人员才能将HTML转换为Java。

获取所见即所得的ui编辑器,它将为我们节省大量时间。我使用GWTDesigner。

GWT的最大优势在于能够忘记跨浏览器的问题。它不是100%,但是可以消除几乎所有的痛苦。结合托管模式调试的优势(相对于Firebug而言,Firebug出色但与Java调试器不同)给开发人员带来了产生复杂ajax应用的巨大优势。

哦,它的运行速度很快,尤其是在使用gzip过滤器的情况下。

稍微偏离主题,但是在我们遇到持续问题的情况下,irc上的#gwt频道非常有帮助。

我将在已经提到的几点上添加一些要点:

  • 数据绑定/验证。 GWT没有开箱即用的数据绑定/验证支持,尽管该领域有一些项目开始出现。我们会发现自己编写了大量这样的文章:
TextField fname, faddress;
...
fname.setText(person.getName());
faddress.setText(person.getAddress());
...
  • 避免急于获取所有数据
  • 我们还必须确保不会发送代理/不可序列化的对象。 hibernate4gwt可以解决这些问题。
  • UI设计。用Java(面板,按钮等)来可视化UI比用HTML来可视化更困难。
  • 历史支持。 GWT没有附带"历史记录"子系统,也没有附带任何用于提供精美url或者全状态书签的子系统。我们必须自己动手(尽管它支持历史记录令牌,这是一个开始)。所有AJAX工具包AFAIK都会发生这种情况。

恕我直言,GWT缺少针对该"线程"中提到的所有问题的开箱即用支持的框架。

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

但是对于大型Javascript项目,这是最佳选择

我们已经与gwt合作了将近2年。我们吸取了很多教训。这是我们的想法:

  • 不要使用第三方窗口小部件库,尤其是gwt-ext。它将破坏调试,开发和运行时性能。如果我们对这种情况有疑问,请直接与我联系。
  • 使用gwt仅填充应用程序的动态部分。因此,如果我们需要与许多字段进行复杂的用户交互。但是,请勿使用其随附的面板。查看我们现有的库存设计师提供的页面。找出将包含应用程序控件的区域。将这些控件添加到onModuleLoad()中的页面。这样,我们可以使用设计师的标准页面,也可以在gwt之外进行所有样式设置。
  • 不要将整个应用程序构建为一个标准页面,然后再动态构建所有片段。如果我们按照我在项目2中的建议进行操作,则无论如何都不会发生。如果我们动态地构建所有内容,则将损害性能,并为中型到大型应用程序消耗大量内存。另外,如果我们按照我的建议进行,后退按钮将非常有用,搜索引擎索引编制也将如此。

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

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

  • CSS样式有时仅是棘手的,使用IE中的IE开发人员工具和Firefox中的萤火虫找出正在发生的事情,我们将清楚知道需要更改哪些CSS
  • 我们可以使用技巧来让Google将其编入索引。一个非常著名的网站是http://examples.roughian.com/,请在Google上查看其评级。一个不太知名的网站是www.salvin.in(无法拒绝提及),我将其优化为单词:salvin主页(在Google中搜索这三个单词)

我对GWT-EXT的了解不多,但是我也相信不需要包含第三方库。

祝我们一切顺利:)

GWT 2.0有望在未来几个月内问世,它解决了许多讨论的问题。

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

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

重用RPC服务对象。
它会导致比赛状态出现类似应用程序挂起的症状。

GWT非常简单直观。

特别是随着UIBinder的发布,允许GWT小部件以XML进行布局,然后以Java进行后台编码。

因此,如果我们使用了其他Ajax或者Flash设计工具或者Silverlight等,则GWT非常容易学习。

如果不是陷阱,最大的障碍就是GWT RPC。我们之所以希望使用GWT是因为GWT异步RPC。否则,为什么不仅仅依靠CSS来格式化页面呢?

GWT RPC是允许服务器刷新服务器上的数据而不必刷新页面的元素。这是对诸如股票绩效监控(或者美国当前的国家和公共债务或者全球第二次流产的未出生婴儿数)之类的页面的绝对要求。

GWT RPC需要花些力气来理解,但经过几个小时,它应该会变得很清楚。

除此之外,在努力学习GWT RPC之后,我们最终发现我们不能将JSP用作RPC的服务组件,除非...我的博客上有一个由8部分组成的文章(我认为)作为GWT RPC服务程序。但是,由于我们只想问一些问题而不是寻求答案,所以我不建议在我的博客上做广告。

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

不是"无法克服",而是一些基本的痛苦。

日期处理:

GWT使用了不赞成使用的java.util.Date,当在客户端处理日期时会导致意外的行为。 GWT不支持java.util.Calendar。更多信息在这里。

相关问题示例:

  • GWT java.util.Date序列化错误
  • 获取GWT中的日期详细信息(日,月,年)
  • GWT中的客户端时区支持