我正在尝试使用RequireJS正常运行jQuery插件,在noconflict / noglobal状态下使用jQuery强制所有模块指示它们是否需要jQuery。但是,对于非AMD友好的插件,shim
配置似乎不起作用。也就是说,如果jQuery插件使用如下包装器定义:
(function($) {
$.extend($.myPlugin, { myPlugin: { version:'0.0.1'} });
})(jQuery);
然后以下RequireJS配置无效:
requirejs.config({
paths: {
jquery: ['//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min', 'jquery-min'],
},
map: {
'*': { 'jquery': 'jquery-noglobal' }, // Force all modules to use the non-global jQuery...
'jquery-noglobal': { 'jquery': 'jquery' } // ...except the wrapper module itself, which needs the real one.
},
shim: {
'sadPlugin': {
deps: ['jquery']
}
}
});
jquery-noglobal.js
:
define(['jquery'], function(jq) {
return jq.noConflict( true );
});
插件代码运行时触发的错误是:“无法在extend
上调用undefined
”,这意味着jQuery
从未设置在外层,因此{{1在自执行函数中未定义。我把断点放在插件自执行函数之外,并在里面验证。
我猜测问题的一部分是大写;该模块编写为期望$
(camelCase),而AMD模块名称为jQuery
(小写)。在jquery
配置中是否有任何方法可以指定注入要求的变量名称应该是什么?
我还尝试在shim
哈希中添加sadPlugin: {'jquery':'jquery'}
条目,希望map
为该模块提供全局jQuery而不是非全局jQuery,但仍然是jQuery / $不是由调用函数的时间定义的。
编辑:找到一个可以解决部分问题的问题:根据here发表的评论,shim
的{{1}}需要要加载的脚本的完整文件路径,并且不能是deps
配置的别名。
所以,因为我的jQuery的CDN-fallback文件是shim
,如果我这样做:
paths
该插件有效!但是,由于现在正在使用“真正的”jQuery,它会污染全局命名空间,然后jquery-min.js
变量可以在没有shim: {
'sadPlugin': {
deps: ['jquery-min']
}
}
的情况下使用,因此无法实现$
的全部目的。 } wrapper ...
答案 0 :(得分:0)
只需使用
return jQuery.noConflict( true );
而不是
return jq.noConflict( true );
因此,作为requirejs中的局部变量,您的插件可以使用变量jQuery作为参数$
(function($) {$.extend($.myPlugin, { myPlugin: { version:'0.0.1'} });})(jQuery);
对我有用的配置是:
- main.js
- jquery-private.js
在main.js文件中:
require.config({
paths: {
},
map: {
'*': { 'jquery': 'jquery-private' },
'jquery-private': { 'jquery': '//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js' }
},
shim: {
myplugins: ['jquery']
}
});
在jquery-private.js文件中:
define(['jquery'], function () {
jQuery = $.noConflict(true);
return jQuery;
});