最大的GWT陷阱?
我在我们select使用GWT实现的项目的开始/中间。 有没有人在使用无法克服的GWT(和GWT-EXT)方面遇到任何重大缺陷? 从性能的angular度来看呢?
我们已经看到/听到的一些事情已经包括:
- Google无法索引内容
- 一般CSS和样式似乎有点片
寻找关于这些项目的任何额外的反馈。 谢谢!
我会开始说我是一个巨大的GWT球迷,但是是有很多陷阱,但即使不是我们能够克服的大多数:
问题:编译时间太长,随着项目的增长,编译时间也会缩短。 我听说20分钟的编译报告,但平均大约1分钟。
解决scheme:将你的代码分解成单独的模块,并告诉ant只在修改时build立它。 在开发的同时,您只需构build一个浏览器就可以大大加快编译时间。 你可以把它放到你的.gwt.xml文件中:
<set-property name="user.agent" value="gecko1_8" />
其中gecko1_8是Firefox 2+,ie6是IE等。
问题:托pipe模式非常慢(至less在OS X上),并不能与您在编辑诸如JSP或Rails页面之类的东西时得到的“实时”更改相匹配,并在浏览器中进行刷新。
解决scheme:你可以给托pipe模式更多的内存(我通常得到512M),但它仍然很慢,我发现一旦你用GWT足够好,你停止使用这个。 你做了大量的改变,然后编译只有一个浏览器(通常20个值得编译),然后刷新浏览器。
更新:使用GWT 2.0+,这不再是一个问题,因为您使用新的“开发模式”。 它基本上意味着你可以在你select的浏览器中直接运行代码,所以不会有速度损失,再加上你可以萤火虫/检查它等。
http://code.google.com/p/google-web-toolkit/wiki/UsingOOPHM
问题: GWT代码是java,并且与布置HTML页面有不同的思路,这使得HTMLdevise变成了GWT
解决scheme:你也习惯了这一点,但不幸的是,将HTMLdevise转换为GWTdevise总比将HTMLdevise转换为JSP页面要慢。
问题: GWT需要一点点的时间,而且还不是主stream。 这意味着大多数join你的团队或维护你的代码的开发者将不得不从头开始学习它
解决scheme: GWT是否会起飞还有待观察,但如果你是一个控制你所雇用的公司的公司,那么你总是可以select知道GWT或想学习的人。
问题: GWT是一个大锤比较像jquery或只是普通的JavaScript。 这需要更多的设置才能实现,而不仅仅是包含一个JS文件。
解决scheme:使用像jquery这样的库来处理适合这些的更小,简单的任务。 当你想在AJAX中构build一个真正复杂的东西时,或者需要通过RPC机制来回传递数据时,请使用GWT。
问题:有时为了填充GWT页面,您需要在页面首次加载时进行服务器调用。 用户坐在那里观看加载符号,而获取所需的数据可能会让人讨厌。
解决scheme:对于JSP页面,您的页面在成为HTML之前已经由服务器呈现,因此您可以实际进行所有GWT调用,然后将它们预载到页面上,以便立即加载。 详情请看这里:
通过预先序列化您的GWT呼叫来加速页面加载
我从来没有遇到任何问题CSS,我的小工具,开箱,自定义或其他,所以我不知道你是什么意思是一个陷阱?
至于性能,我总是发现一旦编译好的GWT代码很快,AJAX调用几乎总是比整个页面刷新要小,但这对于GWT来说并不是唯一的,虽然你使用的本地RPC数据包一个JAVA后端非常紧凑。
我们一直在与gwt工作近2年。 我们吸取了很多教训。 这是我们的想法:
-
不要使用第三方小部件库,尤其是gwt-ext。 它会杀死你的debugging,开发和运行时的性能。 如果您对此有何疑问,请直接与我联系。
-
使用gwt只填写你的应用程序的dynamic部分。 所以如果你有一些复杂的用户与很多领域的交互。 但是,请勿使用随附的面板。 拿你现有的股票devise师提供的页面。 挖掘将包含您的应用程序的控件的区域。 将这些控件附加到onModuleLoad()中的页面。 这样,您可以使用devise师的标准页面,也可以在gwt之外完成所有样式。
-
不要将整个应用程序构build为一个标准页面,然后dynamic构build所有的部分。 如果你按照我在第2项中所build议的做法,这是不会发生的。 如果您dynamic构build所有内容,您将会中止大型应用程序的性能并占用大量内存。 另外,如果你按照我的build议做,后退button将会很好,search引擎索引等也是如此。
其他评论者也有一些好的build议。 我使用的经验法则是创build页面,就像你在做一个标准的网页一样。 然后雕出那些需要dynamic的部分。 将它们replace为具有id的元素,然后使用RootPanel.get( id ).add( widget )
来填充这些区域。
我们陷入的陷阱:
-
虽然使用GWT EXT之类的东西可以获得很多里程,但是如果您在JavaScript库的顶部使用这种薄薄的单板,则无法进行debugging。 我不止一次地把我的头放在桌面上,因为我无法检查(在我的IntelliJdebugging器中)GWT EXT表类中发生了什么…所有你能看到的是它是一个JavaScriptObject。 这使得很难弄清楚什么是错误的
-
没有人知道你的团队谁知道CSS。 从我的经验来看,这个人不是专家并不重要,只要他有一些很好的工作知识就足够了,并且在必要时知道正确的条件。
-
跨浏览器debugging。 留意进程托pipe模式[ 1 ] [ 2 ] [ 3 ],希望在GWT 1.6 …现在,你只需要托pipe模式,使用“编译/浏览”button,在那里你可以玩其他浏览器。 对于我来说,在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支持,比如保持“本地”和“asynchronous”RPC接口和实现同步。)
GWT 2.0应该在未来几个月内推出,解决了很多讨论的问题。
- 使用类似html / xml的语法创build布局
- dynamic脚本加载 – 只有最基本的JS才会被下载。 其余的将根据需要下载
- 浏览器内托pipe模式 – 这可能涉及讨论的托pipe模式速度问题,以及其他好处
- “编译器优化” – 希望编译速度更快
GWT 2.0在Google I / O上预览video
不是“无法克服”,而是一些基本的痛苦。
date处理:
GWT使用不推荐使用的java.util.Date
,在处理客户端date时会导致意外行为。 java.util.Calendar
不被GWT支持。 更多信息在这里 。
相关的问题示例:
- GWT java.util.Date序列化错误
- 在GWT中获取date详细信息(日,月,年)
- GWT中的客户端时区支持
我会给已经提到的那些添加一些观点:
- 数据绑定/validation。 GWT没有开箱即用的数据绑定/validation支持,尽pipe这个领域有一些项目开始出现。 你会发现自己写了很多这样的:
TextField fname,faddress; ... fname.setText(person.getName()); faddress.setText(person.getAddress()); ...
- 延迟加载。 由于gwt在客户端,懒加载实际上不是一个选项。 您必须仔细devise您的RPC和域对象才能
- 发送所有需要的对象数据
- 避免急于提取所有数据
- 你还必须确保你不会发送代理/不可序列化的对象。 hibernate4gwt可以帮助你处理这些问题。
- UIdevise。 在java(面板,button等)中显示UI比在HTML中更难。
- 历史支持。 GWT不附带历史子系统,也没有附带任何子系统的好网站或有状书签。 你将不得不推出自己的(虽然它支持历史记号,这是一个开始)。 所有AJAX工具包AFAIK都会发生这种情况。
恕我直言,GWT是缺less一个框架,开箱即用的支持这个“线程”上提到的所有问题。
我现在正在使用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应用程序的一个很好的解决scheme。 我其实很喜欢托pipe模式的开发,它使事情变得快速和容易。 你也可以debugging你的代码。 使用JUnit进行unit testing也非常稳定。 我还没有看到一个伟大的JavaScriptunit testing框架,我觉得它足够成熟,可以testing一个企业应用程序。
有关GWT EXT的更多信息: http : //gwt-ext.com/
有关EXT GWT(GXT)的更多信息,请访问: http : //extjs.com/products/gxt/
没有我无法克服的重大缺陷。 大量使用托pipe模式。 在使用GWT-ext时,除非您想调整开箱即用的外观,否则几乎不需要自己触摸CSS。
我的build议是使用一个GWT“本地”小部件在一个库中,它们在特征上很接近。
重新search引擎索引:是的,该网站通常不会有可导航的url(除非您只是将小部件添加到常规网站的元素)。 你可以做历史回退/转发function。
前段时间,我一起使用了GWT和GWT-ext。 我发现Web开发的过程非常顺利,但我的build议是:
不要将GWT本机窗口小部件与EXT窗口小部件混合使用。 这是混乱的地狱,因为通常名称是相同的(GWT.Button或GWText.Button?)
发生在我身上的一件事情,使得代码比我想要的更复杂,是我想要一个可dynamic更新的面板b)可级联的
GWT本地面板是dynamic的,分机面板可级联。 解? 包含GWTExt面板的GWT.VerticalPanel …混沌。 🙂
但是,嘿,它的作品。 ;)
我第二次从ykagano的评论,最大的缺点是在MVC失去了V。 尽pipe您可以将真正的UI类与其他客户端代码分开,但您无法轻松使用由graphics/网页devise器生成的HTML页面。 这意味着您需要开发人员将HTML翻译为java。
得到一个wysiwyg UI编辑器,它会为您节省大量的时间。 我使用GWTDesigner。
GWT的最大优势是能够忘记跨浏览器问题。 它不是100%,但几乎把所有的痛苦带走。 结合托pipe模式debugging的好处(与Firebug相比,它非常出色,但与javadebugging器不同),它为开发人员在生成复杂的ajax应用程序方面提供了巨大的优势。
哦,它在运行时很快,特别是如果你使用gzipfilter。
稍微偏离主题,但irc上的#gwt频道非常有帮助,以防万一您有一个持续的问题。
GWT非常简单直观。
特别是随着UIBinder的发布,允许GWT小部件以XML格式进行布局,然后在Java中进行编码。
所以,如果你使用其他的Ajax或者Flashdevise工具,或者Silverlight等等,GWT是很容易学习的。
如果不是陷阱,主要的障碍是GWT RPC。 您希望使用GWT的原因是因为GWTasynchronousRPC。 否则,为什么不只是依靠CSS来格式化您的网页?
GWT RPC是允许您的服务器刷新服务器上的数据而无需刷新页面的元素。 这是对诸如股票performance监测(或者美国当前的国家和公共债务或者第二次全世界stream产的未出生婴儿数量)等页面的绝对要求。
GWT RPC需要一些努力去理解,但是给了几个小时的时间,应该清楚。
在这之上,经过一番努力学习GWT RPC,你终于发现,你不能使用JSP作为RPC的服务组件,除非…我有一个8部分(我认为)在我的博客系列如何使用JSP作为GWT RPC服务商。 但是,既然你没有要求答案,但只是问题,我不会停止广告我的博客。
所以。 我非常相信,使用GWT最糟糕的障碍/陷阱是find如何正确部署GWTasynchronousRPC,以及如何使它能够使用JSP服务器。
我们很难将我们的GWT代码库与我们从网页devise师那里获得的HTML网页模板(我们希望GWTpipe理的具有特定div ID的静态HTML页面)结合起来。 至less在我们使用它的时候,我们不能让GWT与我们网站中没有用GWT编码的部分进行整合。 我们最终开始工作了,但这是一个很大的破解。
- 您必须为每个服务接口编写的Async接口看起来像是可以由GWT编译器自动生成的东西。
- 大型项目的编译时间变长了
但是对于一个大的Javascript项目来说,这是最好的select
GWT 2.4已经修复了许多上述问题,一个很棒的小部件库刚刚出现在Beta(Ext GWT 3.0.4 aka GXT)中,它完全用GWT编写,而不是JS lib的包装。
剩余的痛苦:
- 缺乏CSS3select器支持,在某些情况下可以使用“literal()”来绕过它。
- 缺乏对CSS3和像transitionEnd这样的现代浏览器事件的支持。
- 缺less对Java Calendar类的支持(多年以后)。
- 缺乏JUnit4的支持(5年和数)。
- Google GWT团队缺乏清晰的路线图和发布时间表。
关于GWT 2.4,在debuggingGWT时使用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
一个主要的缺陷是,有时你需要明确地分配一个id到什么最终成为一个HTML元素能够使用某些CSS样式。 例如:一个GWT的TabPanel只会做:当tabPanel的tabBar被分配一个id,并指定一个:hover在该elementId上时,将鼠标hover在tabBarItems上。
我在其他地方写过关于GWT的其他一些缺点 ,但是他们已经被rustyshelfs回答:)。
最近我在GWT上做了很多工作,这是我不得不说的:
- CSS样式有时只是棘手的问题,使用IE浏览器中的IE开发工具和Firefox中的萤火虫来弄清楚到底发生了什么,你会清楚的知道css需要改变
- 您可以使用技巧来让谷歌索引它。 一个非常着名的网站是http://examples.roughian.com/在谷歌检查其收视率。; 一个远不如此着名的网站www.salvin.in (不能抗拒提及),我优化它的话:salvin主页(search谷歌这三个字)
我对GWT-EXT并不了解,但我也相信不需要包含第三方库。
祝你好运:)
GWT做浏览器嗅探,而不是function检测,你的应用程序将无法在一些浏览器(特别是新的)
这里有一些问题的参考:
- google-web-toolkit问题2938:RFE:改进user.agent属性提供程序来应付userAgentstring“掩蔽”
- Iceweasel不再支持? – Google文件帮助
- 每个浏览器的GWT实现
以下是对特征检测的一些参考:
- 浏览器检测(以及做什么)
- function检测:艺术浏览器脚本的状态
- 浏览器function检测
从JavaScript框架比较中提取- 维基百科
重新使用RPC服务对象。
它会导致看起来像应用程序挂起症状的竞争条件。
我碰到的陷阱1.在superdev模式下的不同行为。 例如Someclass.class.getName()在Superdev模式下工作得非常好,并返回类的完全限定名。 在生产模式下这是行不通的。
- addWidget(小部件)将调用小部件的removefromparent()
GWT团队在去年发布GWT 2.7方面做了很多很大的改进。 GWT的一个主要弱点是编译在GWT 2.6及更低版本中花费了很多时间。 这是现在没有GWT没有增量编译,这是超快的,只编译更改。
GWT 2.7现在有( 来源 ):
- 增量构build现在只需几秒钟
- 更紧凑,更精确的SourceMaps
- GSS支持
- JSInterop
- 伟大的JavaScript性能
- 较小的代码大小
得到可靠的事实的最好方法是从gwt调查 。 GWT最大的问题之一就是编译时间很长。 幸运的是,它正在迅速改善,所以在不久的将来它不会是一个重大的问题。 另外一个缺点是,GWT显得更加复杂,因为Java是一种更复杂的语言,可以在每一步都抵制不好的编码器。 另外,编译添加一个图层。 例如,js interop需要一些样板。 根本的问题是,GWT的devise并不简单。 它是从极其复杂的networking应用程序开始devise的,整个社区始终将优先级,性能,代码质量,体系结构等轻松编码。
请记住,你可以在任何时候在GWT中使用js,所以如果你在GWT中挣扎,可以考虑使用js。 在一天结束时,GWT是js,所以你可以在GWT中做任何你可以在js中做的事情。 实际上,大多数GWT项目都使用js。 问题是,GWT是非常复杂的。 尽pipe如此,有时候也值得额外的复杂性。
值得注意的是,GWT 3.0将带来巨大的改进。
GWT是一个技术杰作。 它将客户端和服务器编程统一起来,使其成为一个连贯的应用程序 – 软件在“分层”之前编写的方式,以及应该写入的方式。 它消除了不同的技能组合,团队成员之间的沟通不畅,以及整个网页devise阶段:艺术和编程。 这是最接近你的手机,如Android开发。 事实上,GWT被devise为生成不同的本地UI,而不仅仅是HTML。 虽然它需要巨大的纪律,以确保这种解耦 – 保持你的内层呈现不可知论。
我应该避免的第一个错误是,我花了四年时间才意识到,正在使用第三方扩展,如EXT-GWT,也就是GXT和SmartGWT。 开始使用他们漂亮的桌面小工具而不是投资你自己的造型是非常诱人的,但是我不知道我在SmartGWT上遇到了多less问题,直到我终于厌倦了。 简而言之,它将核心GWTfunction设置在某个(相当过时的)级别,然后build立在它之上。 另外请记住,现在轮廓分明的桌面外观看起来很愚蠢,更不用说缓慢的性能,大量的错误和兼容性function – 特别是在移动设备上。 您希望尽可能地接近本机浏览器控件,即将本地<select>元素呈现的下拉列表,而不是一些自定义绘制的控件。
由于移动趋势,整个用户体验变得越来越简单和平坦,所以你不需要花太多的精力来构build一个外观精美的应用程序。 虽然如果你想“3D”看,也有渐变。 CSS3使一切变得简单,GWT与原始CSS不同,它将其包装为一种优雅的面向对象的方式。 所以不要因为看GWT展示中相当丑陋的准系统而感到气馁。 GWT团队故意没有提供任何样式,因为它是开发人员的工作。
其余的是非常传统的浏览器编程在强types的Java与美丽简洁的API。 但是,当然不要忘记你的代码在浏览器中运行,所以所有的调用都是asynchronous的,例如,你不能在一个循环中调用GWT-RPC方法(来填充一些列表),但是如果你来到这个地方,需要recursion地链接它们情况。
有一些自称的“反模式”就像不使用GWT-RPC。 到目前为止,这对我来说很好:十年。 简单是关键。 为了代码优雅性和可维护性,我甚至不会为此牺牲一些边际性能。 此外,这不是你的瓶颈将在数据库中。 当然要记住你发送给客户的数据量。
如果您无法find或devise现有的小工具 – 请阅读丰富的HTML5元素集,您可以随时包装第三方元素。 我做了一个stream行的jQuery FullCalendar。 根本不是火箭科学。 Google Maps和Google Charts等其他所有function都有半官方的GWT封装。
GWT是完美的。 它没有得到足够的爱的唯一原因是因为早期的互联网采用者谁仍然影响行业不是来自计算机科学和面向对象的语言来欣赏他们。 他们有艺术(Photoshop / WordPress)或networking(Perl / Python)背景。