我处于我们选择使用GWT实施的项目的开始/中期。是否有人在使用GWT(和GWT-EXT)时遇到无法克服的重大陷阱?从性能角度来看如何?
我们已经看到/听到的几件事包括:
- Google无法将内容编入索引
- 一般而言,CSS和样式似乎有些不稳定
寻找关于这些项目的任何其他反馈。谢谢!
我处于我们选择使用GWT实施的项目的开始/中期。是否有人在使用GWT(和GWT-EXT)时遇到无法克服的重大陷阱?从性能角度来看如何?
我们已经看到/听到的几件事包括:
寻找关于这些项目的任何其他反馈。谢谢!
Answers:
首先,我是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真正独特的,尽管如果使用JAVA后端非常紧凑。
我们已经与gwt合作了将近2年。我们吸取了很多教训。这是我们的想法:
不要使用第三方窗口小部件库,尤其是gwt-ext。它将破坏您的调试,开发和运行时性能。如果您对这种情况有疑问,请直接与我联系。
使用gwt仅填充应用程序的动态部分。因此,如果您与许多字段进行复杂的用户交互。但是,请勿使用其随附的面板。查看您现有的库存设计师提供的页面。找出包含应用程序控件的区域。将这些控件附加到onModuleLoad()中的页面。这样,您可以使用设计师的标准页面,也可以在gwt之外进行所有样式设置。
不要将整个应用程序构建为一个标准页面,然后再动态构建所有片段。如果您按照我在项目2中的建议进行操作,则无论如何都不会发生。如果您动态构建所有内容,则将破坏性能,并消耗大量内存用于中型或大型应用程序。另外,如果您按照我的建议进行,后退按钮将非常有用,搜索引擎索引编制也将如此。
其他评论者也提出了一些好的建议。我使用的经验法则是像创建标准网页一样创建页面。然后切出需要动态变化的部分。将其替换为具有ID的元素,然后用于RootPanel.get( id ).add( widget )
填充这些区域。
我们遇到的陷阱:
虽然使用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 2.0有望在未来几个月内问世,它解决了许多讨论的问题。
不是“无法克服”,而是一些基本的痛苦。
日期处理:
GWT使用不推荐使用的方法java.util.Date
,在客户端处理日期时可能导致意外行为。java.util.Calendar
GWT不支持。更多信息在这里。
相关问题示例:
java.util.Calendar
JavaScript 的翻译(编译)。您还可以查看GWT的类CalendarUtil
,如何在GWT中使用java.util.Calendar和 如何在Java GWT中进行日历操作?如何在日期中增加天数?。干杯;)
我将在已经提到的几点上添加一些要点:
TextField 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/
我第二次接受ykagano的评论,最大的缺点是失去了MVC中的V。尽管您可以将真正的ui类与其余的客户端代码分开,但是您不能轻易使用由图形/网页设计人员生成的HTML页面。这意味着您需要开发人员才能将HTML转换为Java。
获取所见即所得的ui编辑器,它将为您节省大量时间。我使用GWTDesigner。
GWT的最大优势在于能够忘记跨浏览器的问题。它不是100%,但是可以消除几乎所有的痛苦。结合托管模式调试的优势(相对于Firebug而言,Firebug出色但与Java调试器不同)使开发人员在生成复杂的Ajax应用程序方面具有巨大优势。
哦,它的运行速度很快,尤其是在使用gzip过滤器的情况下。
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服务程序。
但是对于大型Javascript项目,这是最佳选择
关于GWT 2.4,在调试GWT时使用Firefox,它比使用chrome更快。而且,如果仅使用Firefox,请考虑将这一行放入project.gwt.xml文件中
<set-property name="user.agent" value="gecko1_8" />
另外,如果您使用的是eclipse,则在参数-> VM参数下添加以下内容:
-Xmx512m -XX:MaxPermSize = 1024m -XX:PermSize = 1024m
您可以划分服务器和客户端,并在参数->程序参数下使用以下内容: -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只会将:hover悬停在tabBarItems上。
我最近在GWT上做了很多工作,这是我不得不说的:
我对GWT-EXT的了解不多,但是我也坚信没有必要包含第三方库。
祝您一切顺利:)
GWT执行浏览器嗅探而不是功能检测,并且您的应用程序将无法在某些浏览器(特别是新浏览器)上运行
以下是该问题的一些参考:
以下是有关特征检测的一些参考:
获得可靠事实的最佳方法是通过gwt调查。。GWT的最大问题之一一直是编译时间长。幸运的是,它的改进非常快,因此在不久的将来不会成为一个重大问题。另一个陷阱是,GWT的复杂性大大提高,因为Java是一种更复杂的语言,可以在每一步中抵制不良编码。另外,编译会添加一层。例如,js interop需要一些样板。根本的问题是,GWT并非设计得很简单。它是专为极其复杂的Web应用程序而设计的,整个社区始终将优先级,性能,代码质量,体系结构等置于优先于简单编码的位置。
请记住,您可以随时在GWT中使用js,因此,如果您在GWT中苦苦挣扎,请考虑使用js。归根结底,GWT是js,因此您可以在GWT中做任何可以在js中进行的操作。实际上,大多数GWT项目都使用js。问题在于,GWT非常复杂。尽管如此,有时还是值得额外的复杂性。
值得注意的是,GWT 3.0将带来巨大的改进。
重用RPC服务对象。
它会导致比赛条件出现类似应用程序挂起的症状。
GWT是一项技术杰作。它将客户端和服务器编程结合在一起,使其成为一个一致的应用程序-在“分层”之前编写软件的方式以及应编写的方式。它消除了不同的技能,团队成员之间的沟通不畅以及整个Web设计阶段:艺术和程序设计。它是您最接近移动设备(例如Android开发)的设备。实际上,GWT旨在生成不同的本机UI,而不仅仅是HTML。尽管要确保这种解耦需要大量的纪律,但要使您的内层与显示无关。
您应该避免的第一个错误是我使用了四年的时间才意识到,它使用的是EXT-GWT aka GXT和SmartGWT之类的第三方扩展。开始使用他们漂亮的桌面化小部件而不是投资自己的样式是非常诱人的,但是直到我最终受够了我才能告诉我SmartGWT有多少问题。简而言之,它将核心GWT功能集冻结在某个(相当过时的)级别上,然后在其之上进行构建。还请记住,当今精致的桌面外观看起来很愚蠢,更不用说性能低下,大量错误和兼容性功能-尤其是在移动设备上。您希望尽可能靠近本机浏览器控件,即下拉菜单显示为本机<select>元素,而不是某些自定义控件。
由于移动趋势的发展,整个UX变得越来越简单和扁平,因此您无需花太多时间来设计外观鲜明的应用程序。尽管如果您想获得“ 3D”外观,也可以使用渐变色。CSS3使一切变得容易,并且GWT以不同于原始CSS的优雅的面向对象方式包装了它。因此,不要因为在GWT Showcase中看到相当丑陋的准系统控件而灰心。GWT团队故意不提供任何样式,因为它是开发人员的工作。
剩下的就是强类型Java中带有精美简洁API的常规浏览器编程。但是,当然不要忘记您的代码在浏览器中运行,因此所有调用都是异步的,例如,您不能在循环中调用GWT-RPC方法(以填充某些列表),但是如果您需要这样做,则需要递归地链接它们情况。
有一些自称的“反模式”,例如不使用GWT-RPC。到目前为止,对我来说一直很好:十年来。简洁是关键。我什至不会为牺牲代码的优雅性和可维护性而牺牲一些性能。此外,在数据库中这不是瓶颈所在。当然,请注意您要发送给客户端多少数据。
而且,如果您找不到或设置现有小工具的样式-阅读丰富的HTML5元素集,则始终可以包装第三方小工具。我使用流行的jQuery FullCalendar做到了。根本不是火箭科学。诸如Google Maps和Google Charts之类的所有其他东西都有半官方的GWT包装器。
GWT非常完美。它没有得到足够的热爱的唯一原因是,仍然影响行业的早期互联网采用者并不是来自计算机科学和面向对象的语言来欣赏它们。他们具有艺术背景(Photoshop / WordPress)或网络背景(Perl / Python)。