我一直在阅读GWT中一堆"最高投票"的问题.其中一些问题涉及GWT的缺陷或问题.
在文章中:哪个Javascript框架(jQuery vs Dojo vs ...)?而最大的GWT陷阱?,一些海报似乎表明GWT不够轻,或者有更好的替代品可以使用.
你们中的大多数人都觉得GWT有问题没有用GWT 2.0修复 - 这会让你倾向于建议在新项目中使用更简单的框架吗?
在某种程度上,GWT不应该在某种程度上面向未来(因为你不必担心它在发布之间发生巨大变化,因为它得到谷歌的支持)?
我意识到这个问题的答案在很大程度上取决于你想做什么或你想做什么.我从启动一个最终将被数百万用户使用的新Web应用程序的角度来看这个.
让我们从我能想出的所有权衡开始:
你正在使用Java - 这意味着你的webdevs对javascript的熟练程度不会派上用场(如果你涉足JSNI会有所帮助)
搜索引擎索引的问题 - 恕我直言,这应该是使用GWT或一般纯JS Web应用程序的最大缺点.由于内容,布局,所有内容都是用JS"即时"创建的,搜索引擎只能看到一个非常短的HTML页面,而且就是这样 - 你必须自己以某种方式处理这个问题(例如,使用
隐藏真实内容) .谷歌终于
开始为此开发解决方案,但它似乎对我没什么吸引力.
更新:谷歌终于解决了这个问题.但是,我将此作为权衡,因为使应用程序可爬行仍然需要比其他框架更多的努力.至少现在我们有一个"标准"可以遵循,而不必使用一些可疑的技术(如隐藏真实内容).
它很容易(特别是对于GWT的初学者,特别是当那个人来自HTML/JS背景 - 没有太多的面向对象体验时)全部"哇,这些'对象'的东西太酷了,让我把所有的东西都搞定
这就是我能想到的权衡 - 如果有人想要添加一些内容,请添加评论. 现在为了优势.我将跳过一些像国际化,跨浏览器兼容性的免费,轻松与其他谷歌库集成等,因为它们有点明显且易于掌握.我会尝试专注于不太强调但仍然非常重要的功能:
编译器 - 现在,我与GWT谈过的大多数人都没有意识到GWT的这个部分有多么神奇 - 对于初学者来说,从去年的Google IO开始尝试这个演示.编译器具有整个应用程序的视图.
所以它可以优化这样的东西: ..到这个: 然后混淆这个并尽量减少.另外,这是以这种方式完成的,这使得生成的文件可以通过gzip更加可压缩.
您正在使用Java - 无论您是否喜欢Java,不可否认它是一种非常好的面向对象
语言,它允许编写易于维护和可测试的代码(我认为使用JavaScript无法实现这一点) ).如果您遵循一些好的指导原则,您将获得一个代码,这个代码不仅适用于您,也适用于其他开发人员.值得一提的另一件事是,所有那些在"纯"Java中工作的漂亮设计模式等也可以在这里工作. GWT的一个好消息是,几乎每个新版本的框架都可以免费获得性能提升和新功能.由于Java编译为JavaScript,因此只需重新编译即可从新编译器中进行优化或获得新功能(如GWT 1.5中引入的可访问性支持). 调试 - 值得一提的是,您可以(并且应该:)使用IDE的调试器调试您的GWT应用程序,就像任何其他Java应用程序一样.而且,一般来说,我见过的Java调试器比它们的JavaScript版本更先进. UiBinder - 虽然它仍然不是"完美",但是UiBinder让你使用XML以简单直观的方式设计你的小部件(而不是以2.0之前的方式强迫你用Java做).混合HTML和GWT的小部件从未如此简单有趣;) 使用CSS - 当然,GWT一直采用CSS,但随着GWT 2.0(和UiBinder)的推出,他们将它带到了另一个层面.让我们看一下来自"普通"Web应用程序的CSS文件 - 数百行,如果不是数千行,难以导航,某些样式是多余的,但很难注意到,有些根本没用过,添加到这个混合中需要取悦IE6/7,你会让自己成为一场噩梦.使用GWT,您可以指示它执行它为CSS的JS代码执行的类似任务 - 因此它将修剪所有未使用的CSS样式,在适当的地方合并,最小化和模糊类名称等等(包括CSS文件中的条件,常量等).我们鼓励您将样式保存在各自的UiBinder的XML文件中 - 使组织和查找它们变得更加容易.最后但并非最不重要的是,当你拼错CSS样式名称时会出现错误 - 减少麻烦然后尝试通过Firebug或类似工具执行相同操作 OOPHM - Out of Process Hosted Mode,这样,它们解决了GWT的一个最大缺点 - 现在,您可以在您选择的浏览器中使用托管模式(如果选择的是Firefox,Safari,IE或Chrome,但是至少你可以使用你想要的任何版本).OOPHM的设计还允许你做一些很酷的事情,比如在VM中运行Windows,然后从IE连接到主机操作系统(Linux/MacOS)上运行的托管模式 - 不需要黑客攻击,每次编译后复制文件,等等 你会说/ɡwɪt/很多;)(这是关于Google IO 2009,IIRC 上的一个演讲的引用) 更多..看看来自Google IO 2009的视频,浏览GWT wiki,看看有什么能让GWR更容易创建RIA并且不易出错的东西:)
根据您的经验和/或偏好,以下可能是一个优势(对我而言,但有时它是PITA;))或不:
小部件的开箱即用集合小而简单.现在,如果你来自一些完整的GUI框架(无论是网络还是桌面),你可能会惊讶于GWT的Widgets数量相对较少.但根据GWT的开发人员的说法,它就是故意保留的 - 基本的Widgets是构建自己的小工具所需的所有工具/"块",可根据您的需要自定义Widgets.另一种方法是提供各种必须支持许多用例的多用途小部件......结果是有点缓慢的用户界面(至少恕我直言 - 检查自己的项目,如SmartGWT或Ext GWT).也就是说,GWT Widgets编写得非常好 - 例如
底线是 - 尝试GWT,你很可能会喜欢它,并且永远不会想再用纯JavaScript编写;) 我们正在使用GWT定期构建小型(~2K Java类)到中型(~6K)企业系统,因为版本1.3已经发布.我知道在公共站点中有一组不同的问题要解决,每秒有一千次点击,但我会试着说明我们在GWT 1.x中遇到的最大问题以及GWT 2.0如何解决这个问题. 浏览器内存泄漏 IE6泄漏与GWT是巨大的,IE7泄漏可以通过定期页面刷新来补偿,IE8承诺在这方面有一些稳定性,但在企业中尚未被广泛接受.是的,即使是没有本机JS调用的有效GWT代码也会在某些情况下泄漏内存.特别是当UI很复杂并且你正在做很多Panel.clear()调用时.目前没有有用的工具来确定泄漏的真正原因.除非你知道如何破解浏览器本身. 渲染性能您必须非常仔细地编写UI代码,尤其是在构建常用的自定义小部件时.仍然需要深入的JavaScript,CSS和DOM知识.关于这个主题,互联网上有很多材料.您需要知道如何以及何时从GWT小部件级别下载到直接DOM操作. 可下载内容的大小在2.0之前不可能将模块拆分到不同的可下载部分而不需要在应用程序中内置"硬"导航.但这将清除JavaScript上下文并需要窗口重新加载. UI开发人员Mind Shift经验丰富的UI开发人员只是不了解Java和OOP.有经验的Java开发人员不了解CSS,JS,HTML,也不喜欢构建UI.UI Binder走向正确的方向. 我们已经完成了迁移1.3 - > 1.5 - > 1.7,它总是只是一个重新编译和一些CSS修复.GWT 2.0删除了许多已弃用的代码和初始方法(项目结构,GWTShell),并且可能很难快速迁移.但是所有功能看起来都很有前景,谷歌在某些时候已经放弃了遗留代码.我不确定2.0的稳定性,因为我们还没有在实际项目中使用它. 希望这可以帮助.Widget
,有很多的Handlers
中的每一个细胞FlexTable
......然后他(她)会浪费了很多时间,想知道为什么应用程序感觉迟钝;)tl;博士:GWT中的初学者很容易通过编写符合文档/样本/常识的代码来使他们的应用程序"膨胀";)建议
好处
public class ShapeExample implements EntryPoint {
private static final double SIDE_LEN_SMALL = 2;
private final Shape shape = new SmallSquare();
public static abstract class Shape {
public abstract double getArea();
}
public static abstract class Square extends Shape {
public double getArea() { return getSideLength() * getSideLength(); }
public abstract double getSideLength();
}
public static class SmallSquare extends Square {
public double getSideLength() { return SIDE_LEN_SMALL; }
}
public void onModuleLoad() {
Shape shape = getShape();
Window.alert("Area is " + shape.getArea());
}
private Shape getShape() { return shape; }
}
public class ShapeExample implements EntryPoint {
public void onModuleLoad() {
Window.alert("Area is 4.0");
}
}
在两者之间
SuggestBox
有很多地方,你可以用自己的覆盖默认行为-你可以指定一个不同的方式来显示的建议(SuggestBox.SuggestionDisplay
),触发一个自定义操作,当用户选择一个建议(SuggestBox.SuggestionCallback
),或者只是提供自定义SuggestOracle
用于供给SuggestBox
与Suggestion
小号...
好朋友说!
2> Dmitry Buzdi..:
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有