最大的GWT陷阱?[已关闭]

2022-08-31 06:31:42

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

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

  • 谷歌无法将内容编入索引
  • CSS和样式通常似乎有点不可靠

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


答案 1

我首先要说的是,我是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相比。它需要更多的设置来实现它,而不仅仅是包括一个JS文件。

溶液:将 jquery 等库用于适合这些任务的更小、更简单的任务。当您想要在 AJAX 中构建真正复杂的东西,或者需要通过 RPC 机制来回传递数据时,请使用 GWT。


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

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

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


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

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


答案 2

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

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

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

  3. 不要将整个应用构建为一个标准页面,然后动态构建所有部分。如果你按照我在项目2中的建议去做,这无论如何都不会发生。如果动态构建所有内容,则会降低性能并消耗大量内存用于中型到大型应用程序。另外,如果你按照我的建议去做,后退按钮会很棒,搜索引擎索引等也会很好。

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


推荐