支持多个JavaScript库

3

我使用Dojo开发了一个模块,已经进行了许多自定义插件和服务器支持,允许与我的服务器进行AJAX调用、RPC+SMD通信。但是,现在我正在处理用户方面的事情时,我发现jQuery已经拥有一些非常好的内置插件。你认为能够在不成为巨大问题的情况下实现两种JS库的支持吗?

我能够实现什么样的集成?有人有这方面的经验吗?

我为我的管理面板写了大约30k行代码使用的是Dojo...

5个回答

7

jQuery非常擅长不干扰内置JavaScript对象的原型(与Prototype不同),这使得它可以很容易地与其他库一起使用。

潜在冲突的一个来源是jQuery将$用作jQuery的快捷方式。如果这与dojo有冲突,我不是dojo用户,但有说明来解决这个问题。

话虽如此,我认为你最好看看这些jQuery插件,并将它们重写并移植到dojo。我相信dojo社区会感激你,并且这会给你带来经验。它还会使你的应用程序在腰围上变得更加苗条。

编辑:我注意到有几个答案将添加额外库的下载速度轻描淡写。我建议你对此持怀疑态度。

作为开发人员,我们倾向于只看到在本地主机上或在100 Mbit LAN上从开发服务器下载库需要额外10毫秒。但是,从加利福尼亚州到弗吉尼亚州或特别是从美国到欧洲的下载速度并不那么微不足道。此外,它还会给客户端的JavaScript引擎增加进一步负担。如果他们使用一台1-2年前的良好计算机,并且使用Safari或Chrome,那么这将是可以忽略不计的,但如果他们正在使用IE、FF2或某些版本的FF3,则差异可能很大,或者至少是可测量的。


1
谢谢hobodave。我认为你可能是对的。我绝对喜欢Dojo,只是不知道为什么一开始选择它,当今似乎每个人都使用jQuery这样的标准库。这有点令人沮丧,但是Dojo社区绝对棒,#dojo是一个很好的地方! - Layke
2
我认为Dojo只是被低估了,而jQuery有更多的动力(这意味着更多的插件,更多的用户,更多的...)。出于这个原因,我仍然主要使用jQuery,但不会担心使用Dojo! - Iain Collins
1
不是JS库的命名空间是主要问题,而是它们都操作相同的DOM。在混合使用库时,我期望开发时间的减少能够与测试和维护工作的增加相匹配。 - Sean Hogan
1
愉快的是,Dojo不使用$。Dojo在避免对象原型和全局名称方面也非常小心,因此这两个库在这个领域不应该有冲突,我已经看到这些库在各种场合一起使用。当然,每个插件或库扩展的确切内容都不同,因此即使在同一个库中,逻辑上仍然存在一些冲突的可能性。 - peller
@hobodave 尽管我非常喜欢效率,但我不认同加载时间的重要性。最多只需一次操作,在3G连接的移动设备和遥远服务器之间,应该是一个次秒级别的一次性操作。不可避免的低效图像压缩(包括像PNG与alpha通道这样的渲染时间)对使用额外JS框架造成的开销问题影响极小。 - Iain Collins

1

当使用两个库(我确定它们都是为单独使用而设计的)时,您有两个主要问题:

  1. 一个库会影响另一个库。
  2. 依赖于两个库会使页面变得臃肿。

在这种情况下,我敢打赌#1不会发生。虽然#2仍然是一个问题。


我认为 Dojo 影响 jQuery 的唯一方式是因为 dojo.parse()。但我不会太担心这个问题。我非常关注第二点和膨胀问题。 - Layke
如果不同的库可以合作增强相同的元素(事件处理程序、样式、修改内容等)甚至是DOM树的同一分支,我会感到惊讶。如果使用事件委托 - live() 在jQuery中,我也会提高警惕以防出现问题。 - Sean Hogan

1

1

Query.noConflict() 可以很容易地实现互操作性,因为您可以重新定义 $。正如 hobodave 所指出的那样,Prototype 在这方面表现不佳(因为您不能轻松地使用 Prototype 重新定义 $)。我不确定,但我认为 Dojo 没有任何自己的问题,并且可以与其他框架良好地协作(如果不是这样,请有人纠正我)。

我遇到的最大问题是特定框架编写的“必须拥有”库的数量,例如用于复杂图形绘制等的库,从头开始实现将非常困难。

膨胀是不好的,但与图像大小相比,JS 脚本大小几乎可以忽略不计(因为它非常小,连接速度非常快,而且只在第一次页面加载时出现,如果您正确地进行缓存,它几乎不是问题)。我会说可维护性更令人担忧,这是一个决定是否想要在您正在使用的任何框架中重新发明必备插件的问题。


0

我在多个项目中使用了Prototype、jQuery和ExtJS(因为各种原因),几乎总是同时使用jQuery和ExtJS。一种限制问题的方法是避免在同一页中混合使用不同库——将管理页面保持为dojo,新页面使用jQuery——但这有什么乐趣呢?:-)

我在整合jQuery和ExtJS时很少遇到问题。我选择一个框架来处理类/对象/继承的问题(我使用ExtJS),并坚持使用它。然后,我使用ExtJS创建大多数小部件,而使用jQuery进行低级别的DOM操作和简单的小部件。再次强调,我不能回想起使用两个库时遇到过冲突,但FireBug是一个发现此类冲突疑似原因的好工具。


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