为什么我应该使用jQuery而不是GWT?(这是一个关于IT技术的问题)

75

我需要在jQuery和GWT之间为我的新项目做出决定。

我有一段时间没有使用JavaScript编程了,最近几天一直在研究GWT。它看起来非常棒,能够生成不同浏览器下的所有JS代码,但是:

  • 使用Java进行开发比使用jQuery更耗时(至少对于这个项目而言)
  • 文档质量较差(例如,在设计页面时应该使用哪些元素?-没有足够的文档说明)

我大多数项目都使用jQuery,效果还不错。

我想说服客户选择jQuery更适合这个项目,需要更多支持的论据。


13
GWT 使用 Java 语言,生成 HTML 和 JavaScript。 - BobiYo
1
我认为他指的是Java - 使用Java编写代码,GWT将为客户端生成适当的JavaScript。请参阅http://code.google.com/webtoolkit/overview.html。 - Russ Cam
@Chris GWT让开发人员使用Java编写代码,然后在处理请求时将Java转换为特定浏览器类型的JavaScript。 - AutomatedTester
抱歉,我过早地提到了Java/JavaScript评论。Boban,如果您正在使用gwt生成html + javascript,则不确定是否可以将jQuery用作gwt的替代品。有人能纠正我吗,或者是我没有理解问题的关键点? - Chris Nicol
它们两者确实无法比较,因为它们都有不同的概念。我个人喜欢在项目中使用jQuery,但除了使用GWT开发需要花费的时间是使用jQuery的两倍(对于这个项目100%确定),我需要想出更多的论据:)。感谢您对此事的关注,Chris。 - BobiYo
这似乎更多地基于个人观点。两种技术都有各自的优势。 - Audrius Meškauskas
14个回答

63

我建议使用JQuery。

曾经有一个GWT项目让我不得不重写两次。首先是作为重构后的GWT应用程序,其次是使用JQuery。我已经很久没有认真接触过JavaScript了。上一次是在2002年左右。我是一个Java开发人员,所以我对GWT的第一印象非常好。但那只是印象而已。

我发现GWT存在以下问题:

  1. 它强制要求你遵循其客户端/服务器结构。最终,我只需要AJAX和那些好的小部件。单独看GWT的小部件并不好看。从美学上讲,我更喜欢Adobe Flex!但为了更好地比较,JQuery的UI比GWT的好看。此外,JQuery还有那个Wonderful Theme Roller支持。

  2. 我尝试过DWR。它很棒。使用DWR可以比GWT更轻松地在Java代码中启用AJAX。

  3. 如果你正在使用GWT,最终你将被迫学习JavaScript。SpringSource的Arjen曾经说过关于XML和SOAP(虽然不是确切的引用):“你怎么能开发WebServices而不知道XML?SOAP就是XML。你无法避免它”。同样的事情也存在于GWT中。它最终还是JavaScript。

  4. 实际上,相对于Java而言,学习JavaScript并不那么难。更多的人知道JavaScript而不是Java。甚至网页设计师都知道它。作为一个程序员,你害怕JavaScript吗?

  5. 回到我重新编写的项目。当我重写我们的GWT应用程序时,用了将近两个月的时间。使用JQuery只用了两周,而且我已经有了JavaScript生疏的问题。

  • 使用JQuery,您不必真正编写困难的JavaScript代码。这也是您首先使用JQuery的原因。使用GWT维护代码非常糟糕。您想要查看在代码中进行的最新更改......需要编译......等待GWT......5分钟......重复此过程并希望它不会抛出错误。如果出现错误,您将再次重新编译,并等待另外5分钟。反复循环。使用JQuery只需更改一行,刷新浏览器即可完成。

  • 我知道我在这里没有客观性,但我只是分享我的经验 :) 结论是不要害怕JavaScript。Google 无论如何都使用JavaScript


  • 1
    我只需要编译一次,如果有更新就不断刷新网页 :D - Chan Le
    3
    Chris,你有没有看过GWT 2.*?这个版本会让你提到的很多问题变得更好吗? - Ray
    2
    无论选择什么语言,你可能会感到有必要重写任何应用程序(这并不是 GWT 的错)。我看过一些 Java 应用程序甚至 Web 应用程序,我想重写它们只是因为它们编写得很糟糕,而不仅仅是因为它是 Java。这并不意味着 Java 有错 - 那些 Java 代码的原始作者才是问题所在。我同意编译时间过长的问题占用了太多时间。此外,编写大量 JavaScript 可能会导致代码难以维护,如果你的开发人员没有自律的话。 - Lo-Tan
    9
    我使用GWT和Maven,这使得我在更改服务器端时可以只编译应用程序的服务器端。而当我仅在客户端进行更改时,GWT调试器会立即反映这些更改。因此,只有在我进行既影响客户端又影响服务器端的修改(例如添加新的RPC服务)时,才需要等待5分钟让GWT编译器完成运行,这种情况只可能在开发的早期和之后间歇性地发生。所以我可以说,GWT的调试并不像你所描述的那样。 - Renato
    1
    对于JAVA开发人员来说,GWT编译时间很长,有时候看起来是个不错的选择,另一方面,在GWT中调试Java代码并找到错误是一件很棒的事情。目前我们在一个项目中使用GWT,它为我们工作得很好,比如复杂的GRID帮助了我们,但特定的结构对开发人员来说并不舒适,有些GWT小部件根本没有什么用。我们将GXT与GWT混合使用以获得更好的外观,但GWT的外观并不令人信服,所以我们尝试混合使用GXT + GWT + Smart GWT,但我认为这会导致我们的代码可维护性出现问题。 - Asraful
    显示剩余4条评论

    56

    我建议对于那些不懂 JavaScript 但更熟悉 Java 的团队使用 GWT。使用 GWT,你很可能会在兼容性测试方面节省数天甚至数周的时间,并避免许多新手常见的 JavaScript 陷阱。GWT 还具有出色的打包功能,可用于 CSS 精灵、嵌入式数据和其他功能。

    然而,如果你了解并理解 JavaScript,我会使用 JavaScript,无论你选择哪个库。虽然我还没有仔细检查过 GWT 生成的代码,但我在 Google I/O 上看到了一些示例,虽然看起来很漂亮,但你可能会通过传统方式创建更优雅的 JavaScript 代码。


    1
    我最近在这个主题上发布了一篇文章:http://phiz.posterous.com/gwt-its-not-you-its-me - AlexJReid
    22
    你不需要调试JavaScript代码,你需要调试Java代码。 - Alberto Zaccagni
    1
    @Alberto,我不认为Justin的意思是你所指的那样。他的意思是“debug”在更一般的意义上。 - chris
    1
    我曾经有一个相对复杂的GWT项目,而且在没有接触JavaScript的情况下就让它运行起来了。这既是对Google的赞扬,也是对GXT的肯定。 - Jorel
    1
    @Matt 别胡说了。只提供部分问题的信息是完全有效的。 - Justin Johnson
    显示剩余4条评论

    18

    如果你的团队最熟悉Java,并且计划进行大量的客户端功能,则至少应该评估GWT。类型安全性、Eclipse调试和服务器端/客户端之间共享代码将使你的Java开发团队感到舒适。

    然而,如果你的团队习惯于使用jQuery或其他JavaScript库进行JavaScript编程,则更容易坚持使用纯JavaScript技术。GWT有一种接管页面大部分内容的方式,这对大多数JavaScript开发人员来说是不熟悉的。我所说的接管页面是指典型的GWT代码喜欢创建自己的DOM元素,而不是向页面上现有的元素添加功能。这就是为什么许多GWT应用程序在页面首次加载时会出现“正在加载...”屏幕。这并非必要,但这是最常见的GWT开发风格。

    GWT生成的代码对大多数GWT开发人员来说不太相关。GWT允许你将Java编译成类似于普通Java *.class文件的东西,但其语法是JavaScript,Web浏览器知道如何解释它。GWT更像是一个编译器,而不是基于模板的代码生成器。有时你需要检查生成的代码,但大多数情况下,你的调试将在Java中通过Java调试器进行。

    另一个需要考虑的问题是,无论您选择哪种客户端技术,您的开发团队都需要熟悉HTML、JavaScript、CSS和浏览器编程。GWT允许您在熟悉的Java环境中编写客户端代码,但它并不隐藏您正在浏览器内部工作的事实。

    15
    首先,将GWT与jQuery进行比较并没有太多意义。虽然jQuery旨在使跨浏览器的DOM操作更加容易,但GWT旨在创建大型Web应用程序。
    因此,如果您有一组带有一些独立小部件(如日历、滑块等)的静态页面,jQuery就足够了。如果您想构建单页面应用程序,可能需要一个庞大的团队,GWT是更好的选择。 GWT在幕后拥有很多设计良好的架构,特别是内置的MVP模式、UI-Binder模板系统、i18n支持等。
    因此,作为一名JavaScript开发人员,在一个大型的GWT应用程序上工作了超过一年后,我建议绝不要只使用jQuery构建单页应用程序,因为它不是为此而构建的。如果您想使用JavaScript,请看看backbone、spine、knockout或dojo。
    顺便说一句,尽管GWT的架构非常好,您将面临许多JAVA开销。因此,如果您的项目正在增长,编译CSS和i18n属性的时间会变得很烦人。

    1
    一个很好的用于构建应用程序的JS框架是Enyo,它在某种程度上比backbone或knockout更全面。 - inta

    10
    “因地制宜” 根据项目需求选择最合适的工具。需要考虑以下因素:
    • 时间紧迫,更熟悉其中一种工具
    • 速度和可维护性,以便其他开发人员使用所选的工具。一种工具比另一种更为普及可能会有影响。
    • 是否已经在项目中有可以使用的代码,例如插件、实用函数等。
    如果不知道项目的具体情况,你的经验如何以及客户是否愿意使用不同的技术/框架,就没有明确的答案。
    列出支持某种工具的有力论点,就像我已经开始的那样,并与参与项目的其他人讨论以得出结论。

    10
    答案并不简单。答案是 "取决于":
    GWT:
    • 如果你熟悉并喜欢Java
    • 如果你的服务器代码也是用Java编写的,那么在客户端使用Java编写客户端代码可以在客户端和服务器上使用相同的代码
    • 如果你喜欢强类型语言提供的功能:编译时类型检查,自动重构,自动生成代码(Eclipse中的Ctrl+1),代码完成(Ctrl+Space)
    • 如果您喜欢组件式编程(例如 MenuBar 创建菜单)
    • 如果 GWT 的复杂性(与 jQuery 相比)不是问题
    • 如果大量生成的代码对您来说不是问题
    jQuery:
    • 如果你熟悉并喜欢JavaScript
    • 如果您不需要在客户端和服务器上使用相同的代码(例如,客户端-JS,服务器-Java或PHP)
    • 如果您不需要编译时类型检查、自动重构等功能
    • 如果您不需要组件式编程(要创建一个复杂组件,需要创建一系列 div,并调用 $(“这些div”)。makeXXXXControl())
    • 如果您喜欢简单性(jQuery 比 GWT 简单)
    • 如果您需要非常小的代码(例如使网站加载更快)
    个人而言,我会推荐大多数项目使用 GWT,但 jQuery 也有优点,有些人可能更喜欢jQuery。

    3

    我认为GWT过于抽象了。Javascript实际上是一种强大的语言。您可以编写面向对象的代码并使用命名空间。使用类似jQuery这样的库,您不必担心大部分情况下的浏览器兼容性问题。现在所有主流浏览器都提供了很棒的浏览器开发工具(如Firebug),所以使用javascript非常容易。当javascript出现错误时,我可以轻松地确定它发生在我的代码的哪个位置。我可以监视变量并详细了解正在进行的所有操作,因为我正在针对自己编写的代码进行操作(与GWT不同)。


    3

    我同意Russ Cam的观点,这取决于团队熟悉程度。当我为我的个人业务应用程序工作时,我更喜欢GWT。我发现带有jQuery的javascript语法令人恼火。如果您的应用程序有10,000行UI代码,jQuery会导致一堆难以维护且无法重复使用的代码混乱。

    有人知道用jQuery完成的大型项目吗?

    如果你试图从结果文件大小中挤出每一个字节,请不要使用任何库并从头开始编写javascript(例如:Google主页淡入效果)。

    关于javascript / jquery与gwt的一些想法。如果您使用常见的面向对象原则和设计模式,您可能会获得更好的性能代码。为什么呢?

    让我们以多态为例。如果您编写一个在javascript中使用大量多态的应用程序,则将获得提供可维护性和代码重用的好处。但是,您的代码也会受到使用多态所带来的性能影响。

    现在,如果您使用gwt,您也将获得提供可维护性和代码重用的好处,但是gwt编译器将将多态优化为具体类使用,从而提高了性能。


    3
    一些使用jQuery/Vanilla Javascript的大型项目包括:Gmail,Google Reader,Google Maps,Groupon,Shopify,Facebook等。关键在于知道如何使用Javascript。你应该将Backbone/Knockout/Angular与GWT进行比较,而不是将GWT与jQuery进行比较。 - Celso Dantas

    3
    我认为GWT与本地JavaScript解决方案(如jQuery或其他框架)相比存在以下主要问题:
    - 存在附加过程将您与最终产品分开。您使用Java开发应用程序并调试Java代码,但是发布的是此代码的机器翻译版本。对于一个相当大的应用程序,我无法想象您不需要有时调试在浏览器上运行的实际代码,这会带来一些麻烦,因为那不是您的代码。 - 由于代码是用Java编写的,因此您只能使用Java库。如果您喜欢某个JS库,将其添加到GWT项目中将非常困难,可能需要编写一个Java包装器。如果您正在开发本地JS,则可以将其直接添加到项目中。 - JS本身就是一种很棒的语言,具有坚实的对象模型,它与Java不同。我已经为HP webOS为原生JS编写了一些应用程序,并惊讶地发现我的许多关于该语言的预设都不正确。您可以像使用Java一样在JS中编写干净、高效且可维护的代码,如果您花时间了解JS对象模型,则甚至不需要使用支持库来模拟更典型的类/对象模型,例如Java和C ++中所使用的模型。Javascript的原型非常酷。 - 如果您考虑发布应用程序的移动版本,则可以轻松地将本地JS应用程序包装在phonegap中,并且可以访问多个移动平台,无需额外努力。也有GWT的phonegap包装器,但是回到我的第一条,如果您可以选择使用真正的东西,为什么要选择需要翻译/模拟的解决方案呢?
    祝好运。

    4
    这就是为什么我们要用机器码编写应用程序。 - Jaroslav Záruba

    2

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接