代码之家  ›  专栏  ›  技术社区  ›  Michael Balint

为什么是GWT?使用此RIA框架的优势和权衡

  •  36
  • Michael Balint  · 技术社区  · 16 年前

    我一直在阅读GWT的一系列“投票率最高”的问题。其中几个问题涉及GWT的陷阱或问题。

    在条款中: Which Javascript framework (jQuery vs Dojo vs … )? Biggest GWT Pitfalls?

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

    3 回复  |  直到 9 年前
        1
  •  52
  •   Igor Klimer    15 年前

    权衡

    • 您正在使用Java -这意味着您的webdevs在javascript方面的熟练程度不会有多大用处(如果您涉猎JSNI,这将很有帮助)
    • 搜索引擎索引的问题 使用GWT的最大缺点,或 一般来说,纯JS web应用程序。 因为内容,布局,一切 是用JS“动态”创建的 我得设法解决这个问题 cloaking ). 谷歌终于成功了 started to work on a solution for this 然而,它似乎没有 对我很有吸引力。
      更新: 谷歌有 finally addressed 这个问题。然而,我将把这作为一种折衷,因为使应用程序可crawable仍然需要比在其他框架中付出更多的努力。至少现在我们有一个“标准”可以遵循,不必使用一些可疑的技术(比如 ).
    • 尤其地 当这个人来自HTML/JS背景——没有太多面向对象的经验)时,“哇,这些‘对象’的东西太酷了,让我把我所有的 <div> 将这些对象分解成单独的对象,这将使代码变得漂亮整洁”。当然,我有点夸大其词,但你明白了——很容易想象一个没有经验的程序员可以把一个完整的 Widget Handlers 在每个细胞中 FlexTable ... 然后,他会浪费很多时间想知道为什么应用程序感觉迟钝;) tl;dr:GWT的初学者很容易通过编写与文档/示例/常识相符的代码使他们的应用程序“膨胀”;)建议

    这就是我能想到的所有权衡——如果有人想添加内容,请添加评论。

    优势

    现在谈谈优势。我会跳过一些类似的 internationalization , cross-browser compatibility

    所以 可以 优化这样一个系统,类似这样:

    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 这是一个非常好的面向对象的 语言 (我认为这是不可能的 到了这样的程度(使用JavaScript)。如果 你跟着一些 good guidelines , 您将得到一个 不仅对你是可以理解的,而且 对于其他开发人员也是如此。另一个 值得一提的是 那些漂亮的设计模式等等
    • GWT的一个妙处是你 得到 性能增益和新的 免费功能 它是Java编译成JavaScript的,是吗 只需重新编译即可获益 accessibility support 在GWT 1.5中介绍)。
    • -值得一提的是,您可以(而且应该:)像调试任何其他Java应用程序一样,使用IDE的调试器调试GWT应用程序。一般来说,我看到的Java调试器比JavaScript调试器更高级。
    • UiBinder -虽然还不“完美”, UiBinder
    • 使用CSS -当然,GWT一直采用CSS,但随着GWT2.0(和UiBinder)的引入,他们将其提升到了另一个层次。让我们看看一个“普通”web应用程序中的CSS文件——数百行,如果不是数千行,很难导航,有些样式是多余的,但很难注意到,有些样式根本没有被使用,再加上需要取悦IE6/7,你会做一场噩梦。使用GWT,您可以指示它执行与JS CSS代码类似的任务,因此它将删除所有未使用的CSS样式,在适当的情况下合并,最小化并混淆类名, and many more
    • 哎呀 -进程外托管模式,通过这一点,他们修复了GWT最大的缺点之一-现在,您可以在您选择的浏览器中使用托管模式(如果选择Firefox、Safari、IE或Chrome,但至少您可以使用您想要的任何版本)。OOPHM的设计还允许你做一些很酷的事情,比如在虚拟机中运行Windows,并从IE连接到主机操作系统(Linux/MacOS)上运行的托管模式——无需黑客攻击,无需在每次编译后复制文件,等等
    • 你可以说/wt/很多;)(这是对上一篇演讲的引用 Google IO 2009
    • 还有很多。。请看一看来自 浏览 GWT wiki 要查看更多使使用GWT创建RIA更容易、更不容易出错的内容,请执行以下操作:)

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


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

        2
  •  10
  •   Dmitry Buzdin    16 年前

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

    浏览器内存泄漏

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

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

    UI开发人员的思维转变

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

    希望这有帮助。

        3
  •  4
  •   John    16 年前

    在比较YUI和ZK之后,我们在几个月前做出了使用GWT的决定。我还是很高兴我们选择了GWT。GWT网站上的支持级别和文档的总体质量似乎非常高。

    GWT进行模块拆分并提供性能分析,这有助于反驳认为它不够轻量级的论点。