我不知道这是否可行,但我正在尝试开发一个在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处理肮脏的工作的目的。
答案 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本身。