为什么jQuery比其他JavaScript框架更受欢迎?

72

我负责管理一个程序员团队。我很重视我的员工的意见,但最近我们在Web项目中使用哪个框架上产生了分歧。

我个人比较偏爱 MooTools,但我的团队中有些人似乎想要迁移到 jQuery,因为它更广泛地被采用。但仅凭这一点不足以让我允许迁移。

我已经使用过 jQueryMooTools。这篇 文章 倾向于反映我对两个框架的感觉。 jQuery 对于 DOM 操作非常棒,但好像只能帮助你做到这一点。

就功能而言,jQueryMooTools 都允许轻松进行DOM 选择和操作

// jQuery
$('#someContainer div[class~=dialog]')
    .css('border', '2px solid red')
    .addClass('critical');

// MooTools
$('#someContainer div[class~=dialog]')
    .setStyle('border', '2px solid red')
    .addClass('critical');

使用 jQueryMooTools 都可以轻松实现 AJAX

// jQuery
$('#someContainer div[class~=dialog]')
     .load('/DialogContent.html');

// MooTools (Using shorthand notation, you can also use Request.HTML)
$('#someContainer div[class~=dialog]')
     .load('/DialogContent.html');

使用 jQueryMooTools 都可以轻松实现 DOM 动画效果

// jQuery
$('#someContainer div[class~=dialog]')
    .animate({opacity: 1}, 500);

// MooTools (Using shorthand notation, you can also use Fx.Tween).
$('#someContainer div[class~=dialog]')
    .set('tween', {duration: 500}) 
    .tween('opacity', 1);

jQuery提供以下附加功能:

  • 拥有庞大的支持者社区
  • 插件库
  • 与微软ASP.NET和VisualStudio集成
  • 被微软、谷歌和其他公司所使用

MooTools提供以下附加功能:

  • 面向对象框架,具有JS的经典OOP模拟
  • 扩展原生对象
  • 更高的浏览器兼容性,支持原生函数
  • 更易于重用代码
  • 被万维网联盟、Palm等公司所使用

因此,MooTools似乎可以做到jQuery能做的一切,并且还有更多功能(一些我在jQuery中无法实现,但我可以在MooTools中实现),但jQuery的学习曲线较低。

那么问题是,你或你的团队为什么选择jQuery而不是其他JavaScript框架?

注意:虽然我知道并承认jQuery是一个很棒的框架,但周围还有其他选项,我正在尝试决定为什么jQuery应该是我们的选择,而不是我们现在使用的(MooTools)?


3
选择器、链式调用、插件、兼容其他JS库、易于编写自己的插件和选择器、标准化。我敢打赌你可以很快地编写一个OOP插件来使用jQuery。希望每个人都能转向jQuery,因为使用插件比使用别人复杂的JS代码更容易。 - IAdapter
4
如果以更客观的方式提出问题,我认为会减少负面反应。例如,你可以列举一些在MooTools中容易实现的事情,并说明如何在jQuery中解决它们。 - Tomalak
26
请有人重新打开这篇帖子。从这些讨论中可以学到很多东西。这种寻找关闭的做法已经太过分了。 - CDR
4
实际上,广泛认为在生态系统中仅使用一个平台或框架是不安全且不利于进步的。如果某个竞争对手占据了大多数市场份额,那么整个生态系统就无法发展[这就是为什么IE6能够长期主导市场的原因]。 - Andrew Moore
3
jQuery的庞大用户数量具有未来证明其适应新浏览器的优势。当浏览器升级或针对新手机推出新移动浏览器时,它们将会在更多使用jQuery而不是Moo的页面上进行测试。如果jQuery成为大多数页面所使用的“标准”,那么浏览器将不得不适应与之一起工作,而非相反。 - Nosredna
显示剩余6条评论
20个回答

62

这是一个奇怪的问题...我有一种印象...

  1. 你非常熟悉 mootools 并充分利用了其面向对象的模型,使你的代码更易于管理和支持。
  2. 你意识到 jQuery 的目的略有不同,更偏向于 DOM 操作和 AJAX,并且 mootools 做的事情比 jQuery 更加全面。
  3. 听起来你不需要使用太多第三方插件,这使得 jQuery 的流行和支持点变得不那么重要。

总之,这是因为炒作吗?jQuery 正在成为像“AJAX”、“.NET”和“Web 2.0”这样的神奇营销词语,这对他们来说很好,但为什么需要为了证明自己留在这个对你如此有效的框架中而付出代价呢?还有商业考虑因素,我想涵盖以下几点:

  • 框架的长久性,或者说在越来越流行的 jQuery 面前,mootools 是否有可能消失?很难说,因为他们刚刚发布了1.3测试版,并且计划在年底发布2.0版本。
  • 员工及其培训成本(我想寻找 mootools 程序员会比那些只是在简历中添加 jQuery 的程序员更加困难)。
  • 在你的资源下使用不同框架来维护和扩展系统所需的时间(和成本)。

这两个框架都很好,但我认为留在 mootools 中对你最有利。


30
这也是我做出的决定。最终,我选择了Mootools。事实是,我见过太多开发人员在简历上写着jQuery,却完全不知道document.getElementById()的作用,对于jQuery除了“它是带有美元符号的东西”之外,基本没有什么概念。这就是风靡一时的技术的危险之处。人们开始把它放在简历上,即使他们只是对它有一个模糊的概念。 - Andrew Moore
2
鉴于最近的发展,你也可以兼得两全其美。只需看看神奇的mootools核心开发者Ryan Florence不久前实现的这个精彩的魔法作品:http://ryanflorence.com/object-oriented-jquery-with-mootools-pigs-take-flight/ - plouh

60

个人而言,jQuery完全符合我的需求。

我试图在服务器端的代码中处理大部分事情,它有良好的面向对象编程(OOP)、分层以及MVC架构。当需要使用JavaScript时,我发现(迄今为止)jQuery拥有我所需的功能。说实话,这可以分为三类:

  • 简单的DOM操作,通常是在不访问服务器的情况下显示/隐藏内容。
  • Ajax调用,无需多言。
  • UI效果,包括模态弹出窗口、动画、从/向隐藏/显示的渐变过渡等。作为一个后端编码人员,我对UI方面的技能乏善可陈。我真的很喜欢jQuery让我能够以编程方式创建具有吸引力的界面。

此外,jQuery插件库非常庞大,我找到了一些简化客户端工作的库。非常好用。

MooTools引入了面向对象思想,这很好,但并不是我所需要的。我希望将我的整体结构保留在后端,而不必在客户端代码中引入这种思想。对我而言,客户端代码只占据了很小的一部分,从类的角度来思考它是过度消耗和工作量的。如果我想使用MooTools的最佳实践,我感觉自己会构建两个应用程序而不是一个。

我认为这就是为什么jQuery在这里如此受欢迎的原因。总的来说,我们是后端编码人员类型的人,jQuery让我们以编程方式创建一个具有吸引力的用户界面,并让我们专注于后端核心。


6
+1 对于简单UI的优点,我非常认同-- 我讨厌UI编程,能够包含一个或两个插件,添加几行JS代码,将一个简单的带有表单的div转换成模态弹出框,简直棒极了。 - Jonathan Rupp
3
一个简短的问题:在“简单的DOM操作”中,显示/隐藏元素与服务器有什么关系? - Steve Harrison
9
给自己的提示:在充满个人见解的讨论中给出建设性回答仍然会导致被踩的情况:/ - JoshJordan
5
我最受欢迎的回答也是我最不受欢迎的。它目前仍然保持着14票的平衡。有些人不喜欢你夸赞他们不喜欢的技术或指出他们喜欢的技术的缺陷,他们会通过投票来表达这种厌恶。 - Chuck
2
好的观点,如果您的应用程序不是非常交互式,则可以使用jquery,因为您可以将复杂的逻辑保留在服务器上,并且客户端的结构化方法足够好并且易于遵循。然而,任何大型客户端项目很快就会变得难以忍受,如果没有适当的OO/MVC结构。如果您想要像树、网格、菜单之类的小部件,我建议雇用真正的客户端开发人员,并将您的编码分离,以便客户端和服务器代码可以相互独立。这样做的一个巨大好处是,您的客户端将通过Web服务与服务器通信,这些服务可以提供给客户! - Ruan Mendes
显示剩余6条评论

16

我不喜欢在JavaScript中强制使用经典的面向对象编程。有许多方法可以做到这一点,其中一个JavaScript程序员可能正在使用Base2进行面向对象编程,而另一个则使用Prototype、Moo、JS.Class或Joose。Resig故意决定不将类添加到jQuery中,这鼓励人们寻找更本地的JavaScript方法来解决问题。

因此,对于其他jQuery作者编写的JavaScript代码,我更容易理解,并且我编写的jQuery代码也更容易被其他人阅读。我通常不会尝试在JavaScript中模拟类面向对象编程。相反,我会即时创建对象并传递它们,还有许多对象数组。这种思维方式非常容易理解,以至于我甚至将其应用于面向对象编程语言!

我不知道Moo是否已经赶上了jQuery或超越了它。但是我不能花时间跟踪6或7个伟大的JavaScript库,以查看哪匹马领先。

我认为这在很大程度上是一个时间问题。当大量程序员开始涉足AJAX时,jQuery是解决他们问题的炙手可热的新事物。

其他库也基本上赶上了潮流。YUI、ExtJS、Dojo、Moo - 它们都很棒。但是我不能同时使用它们。

我已经在努力尝试理解我正在使用的库的新功能的后果了。例如,jQuery从1.3版本开始增加了Live事件。这实际上让我从许多页面中删除了代码。现在Moo是否也提供了类似的功能,如果提供了,我该怎么知道呢?

我相信Moo很棒。我很想有时间去学习它。但你看过Dojo吗?我必须在一个项目中使用它,发现它也吸取了大部分来自jQuery的好思路。而且它有pubsub和对Comet的良好支持。

我理解你的想法。但是你的程序员说得有道理。学习jQuery对他们的职业生涯有好处,并且如果他们使用jQuery,书籍、示例和其他程序员可以提供帮助。

如果您最终决定使用jQuery,那么在决定是否添加OO库之前,请认真思考。有一些很酷的库(如JS.Class或Joose),但走这步意味着将自己与大多数JavaScript程序员的代码隔离开来。

7
我的首要任务并不是关注员工的职业生涯,而是顾客满意度。目前我们正在使用jQuery来开展三个项目,但是相比同等复杂度的MooTools项目,这些项目中的JavaScript代码更难以维护。 - Andrew Moore
3
另外,MooTools不会将传统的面向对象编程强加到JavaScript中。这是一个你可以使用或完全忽略的特性。实际上,MooTools的面向对象实现将原型继承和经典继承的优点结合在一起! - Andrew Moore
1
事实上,jQuery 项目变糟是因为所有的操作都是通过 jQuery 对象(或者在没有 noConflict 的情况下使用的 $ 符号)完成的。同时,我们最终得到了链式调用大约 75 个函数的代码 [但我需要将这归咎于我的程序员们]。 - Andrew Moore
我打算尝试一下 MooTools。但是我在等待2.0版本。如果没有事件委托,对我来说这将是一个倒退的步骤,而 MooTools 在2.0版本中有事件委托功能。 - Nosredna
根据此链接http://www.clientcide.com/code-releases/clientcide-202-event-delegation-updated-for-mootools-20-compatibility/,直到2.0版本,它才被集成到MooTools中。 - Nosredna
显示剩余4条评论

11

我一直在思考一个问题,尝试理解这个争议的本质。然而,每次看到讨论时,人们总是认为“被更广泛地采用就意味着更好”。

我同时使用jQuery和MooTools,前者在工作中得到了应用(因为它被更广泛地采用),后者则用于个人项目。结果,我发现使用jQuery时总感觉受限制,无论是在JSON支持、元素创建、事件处理等方面。在工作中,我不得不写长达75个事件的链式调用,感觉很难受。

然而,我最大的抱怨是jQuery在插件和第三方开发方面缺乏一致性或惯例。那些流传的“有更多可用的插件”只会让我感到困惑,因为这些插件在结构上或其他方面都没有一致性。我花了几周时间学习“被接受”的插件模型,但即便如此,我仍然需要根据自己实际情况进行调整,因为当前的结构存在错误和低效。虽然任何人都可以开始使用jQuery,但这也意味着你会看到30种不同的方法来完成同一个任务,很难找到一种被广泛认可的标准。

那么,“知道jQuery”到底意味着什么?这是否意味着你知道如何使用.hide()、show()、fadeIn()和fadeOut()等方法?

在工作中,当我需要使用JS时,我会想念MooTools。因为jQuery不支持原生JSON,这真的让人失望......

针对“被广泛采用”的回应,我们都知道OSCommerce是最为“广泛采用”的购物车,但也明白它是一堆垃圾。我并不是在比较JQuery和OSCommerce。我只是指出了“广泛采用”回应的缺陷。

至于插件方面,苹果应用商店有100k个应用,其中50,000个是放屁类应用。当然,有很多JQuery插件,但垃圾与有价值的比例很大。


7
jQuery提供了简洁明了的函数式编程方法。自从C# 3.0中引入了方法链接(LINQ)以来,这对.NET程序员非常有用。因此,从一种语言到另一种语言的转换非常容易。能够查询对象或对象列表的DOM对我们非常有帮助。首先是jQuery的选择功能使其如此吸引人,然后是它的可扩展性,当然还有所有内置功能都很好用。此外,社区支持非常出色,如果找不到解决方案,我会首先查看是否有其他人已经解决了同样的问题,然后再尝试自己解决。最后但并非最不重要的是,微软将在Visual Studio 10中包含并支持它,这也是一个很大的优势。Moo Tools、Prototype等工具无法与上述所有功能相竞争。

3
jQuery社区很棒(而且它也集成在VS中),我承认,但MooTools与jQuery具有相同的选择功能。 - Andrew Moore

7

JS框架很相似,无论如何。如果您已经使用mootools一段时间,请继续使用它。了解您的框架比因为这个或那个选择一个框架更重要。

在我看来,mootools更适合高级JavaScript程序员,而jquery更适合非JavaScript程序员。这是我在阅读两个文档后得出的结论,注意,我没有使用过它们。jQuery缺少对JavaScript核心的支持,例如函数绑定、对象克隆、线程堆栈等。


5

jQuery,像任何框架一样,它只做它该做的事情,如果不适合你的需求,你应该使用其他工具。我不会用jQuery来进行复杂的javascript编程,我使用它是因为它使DOM操作和CSS3样式处理变得简单,而95%的情况下这就是我需要的。


5

我也有一段时间没有看MooTools了。但以下是我对JQuery的看法:

  1. 一致的编程模型(有JQuery的方式可以解决问题)
  2. 出色的文档。当我开始使用JQuery���,它的文档是最好的。
  3. 丰富的第三方插件
  4. 微软支持--我是一个asp.net开发人员,这有助于缓解客户的担忧。此外,它现在已经随我的工具一起发布。
  5. 很多入门指南。
  6. JQuery的网站看起来比MooTool的网站更漂亮。我很抱歉这很重要,但确实如此。请记住,许多工具需要吸引设计师和开发人员。

5

YAGNI。

是的,这可能有点不合适,但这就是jQuery比MooTools拥有更大用户群的主要原因。MooTools带来的所有附加功能都很好,但你不需要它们(YAGNI)。

这不是关于最好的,而是关于满足需求——在手头的问题上找到合适的解决方案。jQuery易于使用,其主要目标是DOM操作。由于95%的人只是为了操作DOM而学习JavaScript,所以没有必要经过更长的MooTools学习曲线。对于他们来说,MooTools不能给他们带来任何jQuery不能用更少的努力实现的东西。

MooTools在你使用它之前需要更多的投入,而jQuery可以让你快速地完成一些工作。如果你开始编写大型、重型的js应用程序,你可能会遇到其中一些缺点,但是再次强调,95%的写js的人不会这样做,所以这些问题对他们来说并不重要。他们使用服务器端语言进行重量级工作,使用JavaScript进行DOM操作。

同样,这些也可能对你的团队无关紧要。按照列表逐点说明(首先是jQuery):

支持者庞大的社区——仅对项目略有关联。对于个人来说更为相关,因为它涉及到离职后的生活。如果不幸降临(上帝啊,请不要),你的公司没有了,jQuery能够比MooTools帮助他们找到更多的工作。

插件仓库——非常相关,因为它有助于避免重复发明轮子。

与微软的ASP.NET和VisualStudio集成——如果你是.NET公司,那么这一点非常相关。实际上,这一点就足以成为切换的理由。

被微软、Google和其他公司使用——谁在意呢?

现在看看MooTools的列表:

面向对象的框架,具有JS经典OOP模拟——除非你的项目的性质使得这成为一个加分项,否则这不重要。我不知道你正在构建什么,但对于网络店铺来说,这只在极少数情况下才是相关的。大多数网络商店没有足够的代码使这成为一个加分项。

扩展原生对象——对于大多数网络商店来说,这也是无关紧要的

更高的浏览器之间本地功能支持的一致性——相关

更容易重用代码——这与jQuery具有大型仓库的优势有些冲突。一个仅仅由大型仓库组成的优势本身就可以说是重用代码。我怀疑你在这里使用了一个狭义的代码重用定义,这可能不是相关的。我已经重用了很多jQuery代码,以及MT代码。

被万维网联盟、Palm和其他公司使用——无关紧要。关于谁在使用什么的唯一相关性是如果你想在那里找工作的话。多少家店铺使用它比任何特定的店铺使用它更为相关。

在处理javascript编程时,没有一种真正正确的方法。摆脱你自己的偏见,和团队一起坐下来,也要让他们放下偏见。谈论具体项目类型(和想要承担的项目类型),以及每个库在这些情况下的优势。 (它们如何处理其他情况并不重要,因为这些其他情况并不存在。)你应该能够从中达成共识。

(YAGNI=如果需要解释的话,就是“你不会需要它”。)


1
我不明白为什么你说MooTools需要更多的努力才能产生结果。如果你不想使用OOP,你不需要在MooTools中使用它。通过代码重用,我并不是指复制粘贴。我是指例如构建一个PointedTips类,然后通过执行类似于new PointedTips($('#myElement'))的操作将其应用于元素[而jQuery则使用插件:$('#myElement')。PointedTips()]。 - Andrew Moore
MooTools有一个第三方插件,可与VS集成。我应该说“开箱即用的集成”。但我们是一个PHP框。 - Andrew Moore
你实际上就是给了我一个很好的例子。在MooTools中,你需要创建一个类,在jQuery中,你只需编写1-2行js代码。如果你的目标是在js中构建一个复杂的应用程序,MT的方法是合适的,但大多数人只是使用js来实现特殊效果,这通常只需要一行jQuery代码。我并不是说jQuery总是更好,我是在说“因地制宜”。在jQuery中,你所要做的事情通常可以更快、更容易地完成,因此它很受欢迎。 - Arlen

4

我选择使用jQuery作为默认的UI库,正是因为它不会像prototype.js或mootools那样扩展或篡改本地对象。再加上文档方面的考虑,就没有什么疑问需要使用哪个框架。


我刚刚看了MooTools的网站。原生类型的增强让我感到有些紧张,但我喜欢他们如何处理哈希表。http://mootools.net/docs/core/Native/Hash - Nosredna

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