RequireJS jQuery插件shim无法正常工作?

时间:2014-09-16 14:25:47

标签: javascript jquery requirejs

我正在尝试使用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 ...

1 个答案:

答案 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;
});