require.js jQuery noConflict shim - 为什么从不调用init方法

时间:2013-05-24 13:53:40

标签: javascript jquery requirejs

我想摆脱全局jQuery对象(window。$,也许还有window.jQuery)。

数据主要:

require.config({
    paths: {
        "jquery": "jquery-2.0.0"
    },
    shim: {
        "bootstrap": {
            deps: ["jquery"]
        },
        "jquery": {
            deps: [],
            init: function() {
                return this.jQuery.noConflict(true);
            },
            exports: "jQuery"
        }
    }
});

require(["jquery", "bootstrap"], function($) {
    // ...
});

这段代码有什么问题?永远不会调用“init”。

2 个答案:

答案 0 :(得分:4)

最有可能不会调用它,因为jQuery实现了AMD模块,并且不需要垫片。

答案 1 :(得分:4)

RequireJS网站上最近更新的Use with jQuery页面详细说明了为什么会发生这种情况以及您可以采取哪些措施来解决这个问题。以下是相关部分:

  

jQuery将自身注册为全局变量“$”和“jQuery”,即使它检测到AMD / RequireJS。 AMD方法建议不要使用全局函数,但是关闭这些jQuery全局变量的决定取决于你是否拥有依赖于它们的非AMD代码。 jQuery有一个noConflict函数,支持释放对全局变量的控制,这可以在你的require.config中自动完成,我们将在后面看到。

如果要抑制这些全局函数,则需要将map配置用于noConflict包装器模块而​​不是shim配置。正如@tomaskirda指出的那样,jQuery不会为支持AMD的库发起shim.initUse with jQuery页面中的相关代码:

require.config({
    // Add this map config in addition to any baseUrl or
    // paths config you may already have in the project.
    map: {
      // '*' means all modules will get 'jquery-private'
      // for their 'jquery' dependency.
      '*': { 'jquery': 'jquery-private' },

      // 'jquery-private' wants the real jQuery module
      // though. If this line was not here, there would
      // be an unresolvable cyclic dependency.
      'jquery-private': { 'jquery': 'jquery' }
    }
});

// and the 'jquery-private' module, in the
// jquery-private.js file:
define(['jquery'], function (jq) {
    return jq.noConflict( true );
});