我正处于一个项目的开始/中期,我们选择使用 GWT 来实现。有没有人在使用 GWT(和 GWT-EXT)时遇到过无法克服的重大陷阱?从性能角度来看怎么样?

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

  • Google 无法对内容建立索引
  • 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+,这不再是问题,因为您使用了新的“开发模式”。它基本上意味着您可以直接在您选择的浏览器中运行代码,因此不会损失速度,而且您可以使用 firebug/检查它等。

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 所独有的,尽管使用本机 RPC 数据包时会得到JAVA后端非常紧凑。

其他提示

我们与 gwt 合作已近两年了。我们吸取了很多教训。我们的想法如下:

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

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

  3. 不要将整个应用程序构建为一个标准页面,然后动态构建所有部分。如果你按照我在第 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 预计将在未来几个月内发布,解决了所讨论的许多问题。

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

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

不是“无法克服”,而是对于一些基本的事情有点痛苦。

日期处理:

GWT 使用已弃用的 java.util.Date 在客户端处理日期时,这可能会导致意外行为。 java.util.Calendar GWT 不支持。 更多信息请点击这里.

相关问题示例:

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

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

恕我直言,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?)

发生在我身上的一件事确实使代码比我想要的更复杂,是我想要一个动态更新的面板

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

但是,嘿,它有效。;)

我赞同 ykagano 的评论,最大的缺点是在 MVC 中失去了 V。尽管您可以将真正的 ui 类与其余客户端代码分开,但您无法轻松使用图形/Web 设计器生成的 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 编码的部分集成。我们最终让它工作了,但这是一个很大的黑客攻击。

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

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

GWT 2.4 已经解决了许多上述问题,并且一个很棒的小部件库刚刚从 Beta 版中出来(Ext GWT 3.0.4 又称为 Ext GWT 3.0.4)。GXT),它完全用 GWT 编写,而不是 JS 库的包装。

剩余疼痛:

  • 由于缺少 CSS3 选择器支持,在某些情况下您可以使用“literal()”来绕过它。
  • 缺乏对 CSS3 和现代浏览器事件的支持,例如 过渡结束.
  • 缺乏 Java Calendar 类支持(很多年后)。
  • 缺乏 JUnit4 支持(5 年了,并且还在继续)。
  • Google GWT 团队缺乏明确的路线图和发布时间表。

关于 GWT 2.4, 使用火狐浏览器 调试 GWT 时,它比使用 chrome 快得多。如果您只使用 Firefox,请考虑将此行放入您的 项目.gwt.xml 文件

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

另外,如果您使用的是 eclipse,请在参数 -> VM 参数下添加以下内容:

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

您可以划分服务器和客户端,并在参数 -> 程序参数下使用以下内容:-codeServerPort 9997 -startupUrl http://你的服务器/项目 -无服务器

另外,为了防止每次更改时刷新服务器,请使用 JRebelhttp://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 才会执行 :hover over tabBarItems。

我写了一些其他的 GWT 的缺点 其他地方,但它们已经被 rustyshelfs 的答案覆盖了:)。

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

  1. CSS 样式有时很棘手,使用 IE 中的 IE 开发者工具和 Firefox 中的 firebug 来弄清楚究竟发生了什么,您将清楚地了解需要更改哪些 css
  2. 您可以使用技巧让谷歌对其进行索引。一个非常著名的网站是 http://examples.roughian.com/ 在谷歌上检查它的评级。一个不太出名的网站是 www.salvin.in (忍不住提一下),我将其优化为文字:萨尔文主页(在谷歌中搜索这三个词)

我对 GWT-EXT 不太了解,但我也相信没有必要包含第三方库。

祝你的决定好运:)

GWT 团队在去年发布的 GWT 2.7 中做出了很多重大改进。GWT 的一个主要弱点是在 GWT 2.6 及更低版本中编译需要很长时间。现在这种情况已经消失了,GWT 没有增量编译,增量编译非常快并且仅编译更改。

GWT 2.7 现在有 (来源):

  • 增量构建现在只需几秒钟
  • 更紧凑、更准确的 SourceMap
  • GSS支持
  • JS互操作
  • 出色的 JavaScript 性能
  • 更小的代码尺寸

获得可靠事实的最佳方法是从 GWT调查. 。GWT 的最大问题之一始终是编译时间过长。幸运的是,它正在迅速改善,因此在不久的将来不会成为一个重大问题。另一个陷阱是 GWT 更加复杂,因为 Java 是一种更复杂的语言,每一步都会抵制不良编码人员。另外,编译又加了一层。例如,js 互操作需要一些样板文件。根本问题是 GWT 的设计并不简单。它是为极其复杂的 Web 应用程序从头开始设计的,整个社区始终优先考虑性能、代码质量、架构等,而不是简单的编码。
请记住,您可以随时在 GWT 中使用 js,因此如果您在 GWT 中遇到困难,请考虑使用 js。归根结底,GWT 是 js,因此您可以在 GWT 中做任何在 js 中可以做的事情。事实上,大多数GWT项目都使用js。问题是 GWT 要复杂得多。尽管如此,有时额外的复杂性还是值得的。

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

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

陷阱我碰到了1。超级开发模式下的不同行为。例如。Someclass.class.getName() 在 Superdev 模式下工作得非常好,并返回类的完全限定名称。在生产模式下,这不起作用。

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

GWT 是一项技术杰作。它将客户端和服务器编程结合起来,使其成为一个连贯的应用程序——软件在“分层”之前编写的方式,以及它应该编写的方式。它消除了不同的技能组合、团队成员之间的沟通不畅,以及整个网页设计阶段:无论是艺术还是编程。这是您最接近移动设备的方式。安卓开发。事实上,GWT 旨在生成不同的本机 UI,而不仅仅是 HTML。尽管它需要大量的纪律来确保这种解耦 - 保持你的内层与表示无关。

您应该避免的第一个错误是使用第三方扩展,例如 EXT-GWT 又名 GXT 和 SmartGWT,我花了四年时间才意识到这一点。开始使用他们漂亮的桌面小部件而不是投资于自己的样式是非常诱人的,但我无法说出我在 SmartGWT 中遇到了多少问题,直到我最终厌倦了。简而言之,它将核心 GWT 功能集冻结在某个(相当过时的)级别,然后在其之上进行构建。另请记住,如今那种轮廓分明的桌面外观和感觉看起来很愚蠢,更不用说缓慢的性能、大量的错误和兼容性功能——尤其是在移动设备上。您希望尽可能接近本机浏览器控件,即下拉列表呈现为原生 <select> 元素,而不是一些自定义绘制的控件。

由于移动趋势,整个用户体验变得更简单、更扁平,因此您不需要做太多事情来设计外观清晰的应用程序。不过,如果您想要“3D”外观,也可以使用渐变。CSS3 让一切变得简单,GWT 以优雅的面向对象方式包装它,这与原始 CSS 不同。因此,不要因为看到 GWT Showcase 中相当丑陋的准系统控件而气馁。GWT 团队故意不提供任何样式,因为这是开发人员的工作。

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

有一些自称的“反模式”,例如不使用 GWT-RPC。到目前为止,这对我来说很好:10年。简单是关键。我不会想到为了代码的优雅和可维护性而牺牲一些边际性能。除此之外,这不是你的瓶颈所在——数据库中。当然要注意您向客户端发送了多少数据。

如果您无法找到现有小工具或为其设置样式 - 读取丰富的 HTML5 元素集,您始终可以包装第三方小工具。我用流行的 jQuery FullCalendar 做到了。根本不是火箭科学。其他一切(例如 Google 地图和 Google 图表)都有半官方的 GWT 包装器。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top