我使用Dojo开发了一个模块,已经进行了许多自定义插件和服务器支持,允许与我的服务器进行AJAX调用、RPC+SMD通信。但是,现在我正在处理用户方面的事情时,我发现jQuery已经拥有一些非常好的内置插件。你认为能够在不成为巨大问题的情况下实现两种JS库的支持吗?
我能够实现什么样的集成?有人有这方面的经验吗?
我为我的管理面板写了大约30k行代码使用的是Dojo...
我使用Dojo开发了一个模块,已经进行了许多自定义插件和服务器支持,允许与我的服务器进行AJAX调用、RPC+SMD通信。但是,现在我正在处理用户方面的事情时,我发现jQuery已经拥有一些非常好的内置插件。你认为能够在不成为巨大问题的情况下实现两种JS库的支持吗?
我能够实现什么样的集成?有人有这方面的经验吗?
我为我的管理面板写了大约30k行代码使用的是Dojo...
jQuery非常擅长不干扰内置JavaScript对象的原型(与Prototype不同),这使得它可以很容易地与其他库一起使用。
潜在冲突的一个来源是jQuery将$
用作jQuery
的快捷方式。如果这与dojo有冲突,我不是dojo用户,但有说明来解决这个问题。
话虽如此,我认为你最好看看这些jQuery插件,并将它们重写并移植到dojo。我相信dojo社区会感激你,并且这会给你带来经验。它还会使你的应用程序在腰围上变得更加苗条。
编辑:我注意到有几个答案将添加额外库的下载速度轻描淡写。我建议你对此持怀疑态度。
作为开发人员,我们倾向于只看到在本地主机上或在100 Mbit LAN上从开发服务器下载库需要额外10毫秒。但是,从加利福尼亚州到弗吉尼亚州或特别是从美国到欧洲的下载速度并不那么微不足道。此外,它还会给客户端的JavaScript引擎增加进一步负担。如果他们使用一台1-2年前的良好计算机,并且使用Safari或Chrome,那么这将是可以忽略不计的,但如果他们正在使用IE、FF2或某些版本的FF3,则差异可能很大,或者至少是可测量的。
当使用两个库(我确定它们都是为单独使用而设计的)时,您有两个主要问题:
在这种情况下,我敢打赌#1不会发生。虽然#2仍然是一个问题。
live()
在jQuery中,我也会提高警惕以防出现问题。 - Sean Hogan大多数流行的JS库都可以限定其自己的全局快捷方式。JQuery可以设置为不初始化$
变量。除了JQuery之外,我听说Dojo和Prototype可以一起使用而不会冲突。
无论您决定使用哪种JS库的组合,获取有关兼容性问题的信息的最佳方法是访问与您将彼此使用的JS库相关的邮件列表。
Query.noConflict() 可以很容易地实现互操作性,因为您可以重新定义 $
。正如 hobodave 所指出的那样,Prototype 在这方面表现不佳(因为您不能轻松地使用 Prototype 重新定义 $)。我不确定,但我认为 Dojo 没有任何自己的问题,并且可以与其他框架良好地协作(如果不是这样,请有人纠正我)。
我遇到的最大问题是特定框架编写的“必须拥有”库的数量,例如用于复杂图形绘制等的库,从头开始实现将非常困难。
膨胀是不好的,但与图像大小相比,JS 脚本大小几乎可以忽略不计(因为它非常小,连接速度非常快,而且只在第一次页面加载时出现,如果您正确地进行缓存,它几乎不是问题)。我会说可维护性更令人担忧,这是一个决定是否想要在您正在使用的任何框架中重新发明必备插件的问题。
我在多个项目中使用了Prototype、jQuery和ExtJS(因为各种原因),几乎总是同时使用jQuery和ExtJS。一种限制问题的方法是避免在同一页中混合使用不同库——将管理页面保持为dojo,新页面使用jQuery——但这有什么乐趣呢?:-)
我在整合jQuery和ExtJS时很少遇到问题。我选择一个框架来处理类/对象/继承的问题(我使用ExtJS),并坚持使用它。然后,我使用ExtJS创建大多数小部件,而使用jQuery进行低级别的DOM操作和简单的小部件。再次强调,我不能回想起使用两个库时遇到过冲突,但FireBug是一个发现此类冲突疑似原因的好工具。