RequireJS - 在上下文中隔离jQuery版本和插件

时间:2012-10-26 03:48:19

标签: jquery jquery-ui requirejs requirejs-text

我有一个项目,它利用多个require上下文和动态加载的jQuery版本和插件。 (jQuery版本将集中采购,不会内联)。主机和每个上下文的jQuery完整性以及插件隔离都很关键。

我正在为RequireJS编写一个加载器插件来处理以下用例:

  • 在特定的需求背景下
  • 在不影响托管页面的fn或任何其他需要的上下文的情况下,我想:
    • 加载我需要的任何版本的jQuery
    • 将插件加载到我特定jQuery版本的fn上
    • 在必需的jQuery版本上具有参照完整性,以便我的require上下文中的任何模块都可以共享插件

我有一个带有测试here的加载器的示例项目。

当我使用加载程序进行第二次调用时,它在最后一个条件下失败,它正在吹走先前的版本。

我也使用eval将加载的插件中的$引用隔离到本地加载的jQuery版本范围。任何有关更好的方法的想法将不胜感激。

如果有更简单/更清洁的解决方案,想要保持简单(愚蠢)。

非常感谢。

1 个答案:

答案 0 :(得分:1)

我还必须在插件中执行此操作。你应该看看http://api.jquery.com/jQuery.noConflict/。举个例子:

jQueryLocal = jQuery.noConflict(true);

但你当然应该尽量避免加载多个jQuery。例如,您可以检查是否已经加载了足够的版本(在我的情况下,我在加载任何内容之前检查了1.9+是否可用,如果是这样,则将局部变量设置为对现有全局jQuery对象的简单引用,但是我没有使用插件。

您可以通过以下方式查看版本:

var jQueryLocal;
var versions = (jQuery && /^([0-9]+)\.([0-9]+)\./.exec( jQuery.fn.jquery )) || [0,0];
if( versions[0] > 1 || versions[1] >= 9 ) {
    jQueryLocal = jQuery;
} else {
    // load script with whatever you're doing. If it's asynchronous, set callbacks etc.
    jQueryLocal = jQuery.noConflict(true);
}