假设我想将jquery与一个使用标准闭包定义的标准的、非启用和启用jquery的插件一起使用:(function($))( $.fn.myplugin = { ... } )(jQuery);和它都位于一个js/libs/jquery/jquery.myplugin.js中。
我使用这个配置:
require.config({
baseUrl: 'js/',
paths: {
'jquery': 'libs/jquery/jquery-noconflict',
'underscore': 'libs/underscore/underscore',
'backbone': 'libs/backbone/backbone',
'jquery-myplugin': 'libs/jquery/jquery.myplugin'
},
shim: {
'backbone': {
deps: ['underscore', 'jquery'],
exports: 'Backbone'
},
'jquery-myplugin': {
deps: ['jquery']
}
});我在jQuery中以无冲突的方式加载libs/jquery/jquery-noconflict.js,因为我不想污染全局命名空间:
define(['libs/jquery'], function () {
return jQuery.noConflict(true);
});我就是这样加载我的主app.js的:
define([
'jquery',
'underscore',
'backbone',
'jquery-myplugin'],
function($, _, Backbone, MyPlugin){
//MyPlugin is always undefined, not even sure if
//I should be passing it here if it only extends jQuery?
});现在,我遇到了一个问题--虽然我可以使用上面定义的所有库而不存在任何问题,但我无法找到正确的shim配置来加载非AMD支持的jquery插件。
我尝试过将jquery-myplugin设置为deps of jquery (以及其他方式),但我无法让它工作。
下面的场景似乎让我有了问题:
我曾见过类似的问题浮出水面,但它们都没有真正解决这个问题,只是给出了一些模糊的建议,如“使用shim”……
编辑
我还试着用
"jquery-myplugin": {
deps: ["jquery"],
exports: "jQuery.fn.myplugin"
}虽然插件方法一旦以这种方式加载到AMD模块,我仍然无法访问:$('.class').myplugin()作为默认$ object还没有用myplugin代码进行扩展。
发布于 2013-01-12 20:42:43
首先,确保“path/to/jquery”实际上扩展了window.jQuery而不是$。
noConflict()对window.jQuery对象进行了定义,但在一些新浏览器上解除了与window.$的绑定,window.$是为本机document.querySelectorAll函数的别名构建的。
其次,您的myplugin不需要返回自己,因为它不能被自己使用。由于扩展了 jQuery,所以从myplugin调用返回jQuery。
最后,“path/to/jquery”不是模块。这是一个普通的JS文件。有可能RequireJS试图像加载模块一样加载它,却找不到define()调用,这会导致混乱。尝试将".js“文件扩展名添加到对RequireJS的信号引用中,即它需要使用"js!”加载资源的插件。
require.config({
paths: {
"jquery": "path/to/jquery",
"jquery-myplugin": "path/to/jquery-myplugin.js"
},
shim: {
"jquery": {
init: function() {
return window.jQuery.noConflict();
},
"jquery-myplugin": {
deps: ['jquery']
init: function($) {
return $;
},
}
}
});https://stackoverflow.com/questions/14189871
复制相似问题