Javascript 如何使用require.js加载带有noConflict的jQuery

Javascript 如何使用require.js加载带有noConflict的jQuery,javascript,jquery,requirejs,Javascript,Jquery,Requirejs,我试图使用require以noConflict模式加载jquery require.config({ paths: { 'jquery': 'libs/jquery-req', underscore: 'libs/underscore', backbone: 'libs/backbone' }, shim: { jquery: { init: function() {

我试图使用require以noConflict模式加载jquery

require.config({
    paths: {
        'jquery': 'libs/jquery-req',
        underscore: 'libs/underscore',
        backbone: 'libs/backbone'
    },
    shim: {
        jquery: {
            init: function() {
                console.log('jq init');
                var jq = this.jQuery.noConflict(true);
                jq.support.cors = true;

                return jq;
            },
            exports: '$'
        },
        backbone: {
            deps: ['underscore', 'jquery'],
            init: function() {
                console.log('b init');
            },
            exports: 'Backbone'
        },
        underscore: {
            exports: '_'
        }
    }
});
然后像这样使用它:

define([
    'jquery',
    'underscore',
    'backbone'
], function(jq, _, Backbone) {
    console.log(jq);
    var initialize = function() {
//        Router.initialize();
    };

    return {
        initialize: initialize
    };
});
不幸的是,似乎从未调用shim.jquery.init函数。有人能帮我理解为什么吗?奇怪的是,当我重命名jquery->jquery reg时,它似乎可以工作,但它需要更改每个文件中定义的依赖项

我正在使用这个:

require.config({
    paths: {
        jquery: 'libraries/jquery/jquery.min',
        underscore: 'libraries/underscore.min',
        backbone: 'libraries/backbone.min',
        jquery_ui: 'libraries/jquery/jquery.ui.min',
    },

    shim: {
        'backbone': {
            deps: ['underscore', 'jquery'],
            exports: 'Backbone'
        },
        'underscore': {
            exports: '_'
        },
        'jquery_ui': {
            deps: ['underscore', 'jquery'],
            exports: 'ui'
        }
    }
});
然后在我的应用程序中,我使用本地作用域来定义jquery的实例。在下面的例子中,$是jquery,但也可以是其他内容

define([
    'jquery', 
    'backbone'
    ], function ($, Backbone) {

    'use strict';

    var app = Backbone.View.extend({
        el: 'body',

        initialize: function() { },

    });

    return app;

});

创建以下noconflict.js模块:

define(["jquery"], function($) {
  //drop the `true` if you want jQuery (but not $) to remain global
  return $.noConflict(true); 
});
然后,在require.config中添加:

map: {
  "*": {
    "jquery": "noconflict"
  },
  "noconflict": {
    "jquery": "jquery"
  }
}
jQuery的noconflict版本将交给所有模块(noconflict除外)。去掉jQuery垫片


请注意,将jQuery排除在全局名称空间之外将阻止您使用任何非AMD的jQuery插件,而不将这些插件修改为AMD模块。Shim没有做任何神奇的事情来利用这个设置。这同样适用于任何非AMD模块,您可能需要根据您制作的“纯”AMD进行填充。

请看这个问题:我认为$仍将在您的方法的全局范围内(即使您没有命名参数$),这是mrok试图避免的。测试它以确保未定义:“”Uncaught ReferenceError:$。我认为没有办法在不向全局范围添加$的情况下加载jquery。我的情况是,我已经加载了jquery1.4.2,并且我希望在无冲突模式下使用最新版本(由require加载)。Chris,我试过你的代码,有$加载到全局范围中-所以我不知道你是如何得到“$未定义”的,也许你在加载它之前已经尝试过使用它了?我相信,即使没有加载jQuery,也可能因为某些调试器使用了$而永远无法取消定义。您将看到类似于
函数$(){[Command Line API]}
的内容,但这不是jQuery,它将保留window.jQuery。通过这种方式,jQuery插件应该都可以正常加载(我相信只是作为填隙片),并且您仍然可以编辑一个干净的$(供其他库使用)以反映该选项。我需要在
$调用之后添加
删除窗口。$
。noConflict()
调用,因为它被设置为
未定义的
,mocha会将其报告为全局泄漏。来自requirejs网站