在noConflict模式下使用jQuery在require.js中加载非AMD兼容的jQuery插件的正确方法?

roc*_*hal 6 amd requirejs

假设我想将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'] 
  }
});
Run Code Online (Sandbox Code Playgroud)

我在无冲突模式下加载jQuery,因为libs/jquery/jquery-noconflict.js我不想污染全局命名空间:

define(['libs/jquery'], function () {
  return jQuery.noConflict(true);
});
Run Code Online (Sandbox Code Playgroud)

这就是我加载我的主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?
});
Run Code Online (Sandbox Code Playgroud)

现在,这是我遇到的问题 - 虽然我可以使用上面定义的所有库没有任何问题,但我无法确定正确的shim配置来加载非AMD启用的jquery插件.

我试着设置jquery-myplugindepsjquery(和其他周围的方式),但我永远无法得到它的工作.

看起来我遇到以下情况的问题:

  1. jQuery在无冲突模式下加载.
  2. 插件代码运行,扩展上面的jQuery实例
  3. 我可以在我的应用程序中使用$,通过插件代码扩展,因此$ .myplugin可用.

我已经看到类似的问题浮出水面,但没有一个实际上解决了这个问题只给出了模糊的建议,如"使用shim config"......

编辑

我也试过用

"jquery-myplugin": {
    deps: ["jquery"],
    exports: "jQuery.fn.myplugin"
}
Run Code Online (Sandbox Code Playgroud)

虽然插件方法一旦以这种方式加载为AMD模块,我仍然无法访问:$('.class').myplugin()因为默认的$ object没有使用myplugin代码进行扩展.

Sea*_*lan 3

使用jQuery.noConflict(true)删除jQuery全局变量。当您的插件加载时,它会尝试访问jQuery,但无法访问,从而导致此失败。

如果您的插件是一个模块,它可以作为依赖项访问 jQuery。或者您可以将其保留jQuery为全局可用。