为什么选择GWT?使用此RIA框架的优势和权衡 [已关闭]

2022-09-01 05:55:05

我一直在阅读GWT的一堆“投票最高”的问题。其中几个问题谈到了GWT的陷阱或问题。

在文章中:哪个Javascript框架(jQuery vs Dojo vs ...)?最大的GWT陷阱?,一些海报似乎表明GWT不够轻量级,或者可以使用更好的替代方案。

你们中的大多数人是否觉得GWT存在一些问题,而这些问题在GWT 2.0中尚未得到解决 - 这会让你倾向于建议在新项目中使用更简单的框架?

在某种程度上,GWT难道不应该是面向未来的(因为你不必担心它从一个版本到另一个版本都会发生巨大变化,因为它得到了Google的支持)?

我意识到这个问题的答案很大程度上取决于你想做什么或你想做什么。我从启动一个新的Web应用程序的角度来看待这个问题,该应用程序最终将被数百万用户使用。


答案 1

权衡取舍

让我们从我能想到的所有权衡开始:

  • 你正在使用Java - 这意味着你的webdevs对javascript的熟练程度不会派上用场(如果你涉足JSNI,这将很有帮助)
  • 搜索引擎索引的问题 - 恕我直言,这应该是使用GWT或一般纯JS Web应用程序的最大缺点。由于内容,布局,所有内容都是使用JS“动态”创建的,因此搜索引擎只会看到一个非常短的HTML页面,仅此而已 - 您必须以某种方式自己处理(例如,使用伪装)。谷歌终于开始为此制定解决方案,但它似乎对我没有吸引力。
    更新:谷歌终于解决了这个问题。但是,我将把这作为一种权衡,因为使应用程序变得狭窄仍然需要比其他框架更多的努力。至少现在我们有一个“标准”可以遵循,而不必使用一些可疑的技术(如隐身)。
  • 它很容易(特别是对于GWT的初学者来说,特别是当那个人来自HTML / JS背景 - 没有太多的面向对象经验)去所有“哇,这些'对象'的东西太酷了,让我把我所有的东西变成单独的对象,这将使代码都漂亮而整洁”。当然,我过分夸大了它,但你明白了 - 很容易想象一个没有经验的程序员可以在一个细胞的每个单元中放一个全面的...然后他会浪费很多时间想知道为什么应用程序感觉迟钝;)tl;dr:对于GWT的初学者来说,通过编写似乎符合文档/示例/常识的代码,很容易使他们的应用程序“膨胀”;)建议<div>WidgetHandlersFlexTable

这就是我能想到的权衡的全部 - 如果有人想添加一些东西,请添加评论。

优势

现在了解优势。我将跳过一些像国际化跨浏览器兼容性免费,与其他Google库轻松集成等,因为它们有点明显且易于掌握。我将尝试将重点放在不太强调但仍然非常重要的功能上:

  • 编译器 - 现在,与我讨论过GWT的大多数人都没有意识到GWT的这一部分是多么神奇 - 首先尝试去年Google IO的演示。编译器具有整个应用程序的视图。

因此,它可以像这样优化这样:

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");
  }
}

然后对此进行混淆并最小化。此外,这是以这种方式完成的,这使得生成的文件通过gzip更易于压缩。

  • 你正在使用Java - 无论你是否喜欢Java,不可否认它是一种非常好的面向对象语言,可以编写易于维护和可测试的代码(我认为JavaScript不可能做到这一点)。如果你遵循一些好的指导方针,你就会得到一个不仅对你,而且对其他开发人员来说都是可以理解的代码。另一件值得一提的事情是,所有那些在“纯”Java中工作的不错的设计模式等,在这里也有效。
  • 关于GWT的一个漂亮之处在于,您几乎可以在框架的每个新版本中免费获得性能提升和新功能。由于它是Java编译为JavaScript的,因此只需重新编译即可从新编译器中的优化中受益或获得新功能(例如GWT 1.5中引入的可访问性支持)。
  • 调试 - 值得一提的是,您可以使用IDE的调试器(并且应该:))像任何其他Java应用程序一样调试GWT应用程序。而且,总的来说,我见过的Java调试器比他们的JavaScript调试器更先进。
  • UiBinder - 虽然它仍然不“完美”,但UiBinder允许您使用XML以简单直观的方式设计您的Widgets(而不是2.0之前迫使您在Java中执行此操作的方式)。混合HTML和GWT的小部件从未如此简单和有趣;)
  • 当然,GWT一直接受CSS,但随着GWT 2.0(和UiBinder)的引入,他们将其提升到另一个层次。让我们看一下来自“普通”Web应用程序的CSS文件 - 数百行,如果不是数千行,难以导航,有些样式是多余的,但很难注意到,有些根本没有使用,再加上需要请IE6 / 7,你给自己一个噩梦。使用GWT,您可以指示它执行与CSS的JS代码类似的任务 - 因此它将修剪所有未使用的CSS样式,在适当的情况下合并,最小化和混淆类名,以及更多(包括CSS文件中的条件,常量等)。我们鼓励您将样式保存在各自的 UiBinder 的 XML 文件中 - 使组织和查找它们变得更加容易。最后但并非最不重要的一点是,当您拼错CSS样式名称时,您会收到错误 - 然后尝试通过Firebug或类似工具执行相同的操作,从而减少麻烦
  • OOPHM - 进程外托管模式,有了这个,他们修复了GWT的最大缺点之一 - 现在,您可以在您选择的浏览器中使用托管模式(如果选择是Firefox,Safari,IE或Chrome,但至少您可以使用所需的任何版本)。OOPHM的设计还允许您做一些很酷的事情,例如在VM中运行Windows,并从IE连接到在主机操作系统(Linux / MacOS)上运行的托管模式 - 无需黑客攻击,每次编译后复制文件等
  • 你可以说/ˈɡwɪt/很多;)(这是谷歌IO 2009,IIRC上的一个演讲中的一句话)
  • 还有更多..看看Google IO 2009的视频,浏览GWT维基,看看更多的东西,使创建RIA更容易,更不容易出错,GWT:)

介于两者之间

根据您的经验和/或偏好,以下可能是一个优势(对我来说是,但有时它是PITA;))或不:

  • 开箱即用的小部件集合保持小而简单。现在,如果你来自一些成熟的GUI框架(无论是Web还是桌面),你可能会惊讶于GWT的Widgets数量相对较少。但根据GWT的开发人员的说法,它是故意保持这样的 - 基本的小部件是你需要构建自己的工具/“块”,根据您的需求定制小部件。另一种方法是提供各种通用的小部件,这些小部件必须支持许多用例...结果是一个有点迟钝的UI(至少恕我直言 - 自己看看像SmartGWTExt GWT这样的项目)。也就是说,GWT Widgets写得非常好-例如,SuggestBox有很多地方可以使用自己的行为覆盖默认行为-您可以指定另一种方式来显示建议(SuggestBox.SuggestionDisplay),在用户选择建议时触发自定义操作(SuggestBox.SuggestionCallback),或者只是提供自定义的SuggestOracle来喂养建议s...SuggestBox

底线是 - 尝试GWT,很有可能你会喜欢它,并且永远不会再想用纯JavaScript编写;)


答案 2

自1.3版本发布以来,我们正在使用GWT定期构建小型(~2K Java类)到中型(~6K)企业系统。我知道在每秒有数千次点击的公共网站中,有一组不同的问题需要解决,但我会尝试讲述我们在GWT 1.x中最大的问题以及GWT 2.0如何解决这个问题。

浏览器内存泄漏GWT的IE6泄漏是巨大的,IE7泄漏可以通过定期的页面刷新来补偿,IE8承诺在这方面有一定的稳定性,但尚未在企业中广泛接受。是的,在某些情况下,即使没有本机JS调用的有效GWT代码也会泄漏内存。特别是当 UI 很复杂并且您正在执行大量 Panel.clear() 调用时。目前没有有用的工具来确定泄漏的真正原因。除非您知道如何入侵浏览器本身。

渲染性能 您必须非常小心地编写UI代码,尤其是在构建常用的自定义小部件时。仍然需要深厚的JavaScript,CSS和DOM知识。互联网上有很多关于这个主题的材料。您需要知道如何以及何时从GWT小部件级别下降到直接DOM操作。

可下载内容的大小 在2.0之前,如果没有在应用程序中内置“硬”导航,就不可能将模块拆分为不同的可下载部分。但这将清除JavaScript上下文并需要重新加载窗口。

UI 开发人员的思维转变有经验的UI开发人员只是不了解Java和OOP。有经验的Java开发人员不懂CSS,JS,HTML,也不喜欢构建UI。UI Binder朝着正确的方向发展。

我们已经完成了迁移 1.3 -> 1.5 -> 1.7,它始终只是一个重新编译和几个 CSS 修复。GWT 2.0 删除了许多不推荐使用的代码和初始方法(项目结构,GWTShell),并且可能很难快速迁移。但所有功能看起来都很有希望,谷歌在某个时候放弃了遗留代码, 这很好。我不确定2.0的稳定性,因为我们还没有在实际项目中使用它。

希望这有帮助。