我不知道这是否可行,但我正在尝试开发一个应用程序,该应用程序在加载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']
}
});
secret-jquery.js
define(['jquery'], function (jQuery) {
return jQuery.noConflict(true);
});
不幸的是,它像这样设置了jQuery插件:
somePlugin.min.js
$.fn.somePlugin = function (options) {
// ...
});
如果我将插件源更改为use define
,则不需要垫片,即
define(['jquery'], function ($) {
$.fn.somePlugin = function (options) {
// ...
});
});
但这违反了不修改第三方插件的规则,尤其是我以后可能会用更新版本换掉的流行插件。
我不能使用全局$
或jQuery
变量,因为我的脚本需要将jQuery注入可能已经加载了它的页面上(并因此使用不兼容的API加载了另一个版本,并且jQuery无法破坏页面上的任何内容)。
有没有一种干净的方法可以做到这一点,还是仅更改插件代码的最佳方法?我想不出其他任何方法,通过XMLHttpRequest保存脚本中的负载,通过define
调用包装它,然后调用eval
它,这似乎违背了让RequireJS处理脏工作的目的。
我们这样做的方法是像这样定义secret-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']
}
});
这使我们在不使用RequireJS的jQuery插件中遇到的问题最少,同时仍允许我们在自己的代码中利用RequireJS。当然,我们没有跟踪一段代码使用哪个jQuery插件,但是我认为,无论如何,jQuery插件通常都不是为了简化这一过程而开发的,因为即使它们能够使用RequireJS,它们也通常不会使用返回任何内容,而是扩展jQuery本身。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句