假设我想将 jquery 与已使用标准闭包定义的标准、非 amd 启用 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
(jquery
和其他方式),但我永远无法让它工作。
似乎我在以下情况下遇到问题:
- jQuery 以无冲突模式加载。
- 插件代码运行,扩展了上面 jQuery 的实例
- 我可以在我的应用程序中使用由插件代码扩展的 $,因此 $.myplugin 可用。
我看到过类似的问题,但没有一个真正解决了这个问题,只给出了模糊的建议,例如“使用 shim config”......
编辑
我也尝试过使用
"jquery-myplugin": {
deps: ["jquery"],
exports: "jQuery.fn.myplugin"
}
虽然插件方法一旦以这种方式加载为 AMD 模块就可用,但我仍然无法访问:$('.class').myplugin()
因为默认 $ 对象尚未使用 myplugin 代码进行扩展。