RequireJS&没有全局$变量的jQuery插件

时间:2015-02-08 00:37:14

标签: javascript jquery jquery-plugins requirejs amd

我不知道这是否可行,但我正在尝试开发一个在jQuery中加载时不会创建全局$jQuery变量的应用,但仍然可以使用一些不是用AMD开发的插件。

主脚本

require.config({
    baseUrl: '/js/lib',
    paths: {
        jquery: 'vendor/jquery-2.1.3.min',
        somePlugin: 'vendor/somePlugin.min'
    },
    map: {
        '*': { jquery: 'secret-jquery' },
        'secret-jquery': { jquery: 'jquery' }
    },
    shim: {
        somePlugin: ['jquery']
    }
});

秘密的jquery.js

define(['jquery'], function (jQuery) {
    return jQuery.noConflict(true);
});

不幸的是,它设置了jQuery插件,如下所示:

somePlugin.min.js

$.fn.somePlugin = function (options) {
    // ...
});

如果我将插件源更改为使用define,我就不需要垫片,即

define(['jquery'], function ($) {
    $.fn.somePlugin = function (options) {
        // ...
    });
});

但这打破了不修改第三方插件的规则,尤其是我以后可能用更新版本换掉的流行插件。

无法使用全局$jQuery变量,因为我的脚本需要将jQuery注入可能已加载它的页面(并因此加载了不同的版本使用不兼容的API,我的jQuery不会破坏页面上的任何内容。)

有没有一种干净的方法可以做到这一点,还是只是更改插件代码的最佳方法?我想不出有任何其他方法可以做到这一点,通过XMLHttpRequest保存在脚本中的加载,用define调用包装它,并eval它,这似乎打败了它让RequireJS处理肮脏的工作的目的。

1 个答案:

答案 0 :(得分:1)

我们如何做到这一点是我们正在定义我们的秘密jquery.js,如下所示:

define(['jquery', 'vendor/somePlugin.min'], function (jQuery) {
    return jQuery.noConflict(true);
});

我们的配置看起来像:

require.config({
    baseUrl: '/js/lib',
    paths: {
        jquery: 'vendor/jquery-2.1.3.min',
        somePlugin: 'vendor/somePlugin.min'
    },
    map: {
        '*': { jquery: 'secret-jquery' },
        'secret-jquery': { jquery: 'vendor/jquery-2.1.3.min' }
    },
    shim: {
        somePlugin: ['jquery']
    }
});

这给了我们jQuery插件的问题最少,这些插件不使用RequireJS,同时仍允许我们在自己的代码中利用RequireJS。当然,我们没有跟踪一段代码使用的jQuery插件,但在我看来,jQuery插件通常不是为了使这简单易用而开发的,因为即使他们能够使用RequireJS,他们也不会# 39; t通常返回任何内容,而是扩展jQuery本身。