【问题标题】:How use require.js to load jQuery with noConflict如何使用 require.js 加载没有冲突的 jQuery
【发布时间】:2015-12-03 04:10:26
【问题描述】:

我正在尝试使用 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 时奇怪的是它似乎可以工作,但它需要更改每个文件中定义的依赖项。

【问题讨论】:

标签: javascript jquery requirejs


【解决方案1】:

创建以下 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 shim。

请注意,将 jQuery 排除在全局命名空间之外会阻止您使用任何非 AMD 的 jQuery 插件,而无需将这些插件修改为 AMD 模块。 Shim 没有做任何神奇的事情来利用这个设置。对于您可能想要填充的任何非 AMD 模块也是如此,这取决于您制造“纯”AMD 的东西。

【讨论】:

  • 注意,如果你只想删除jQuery对$的接管,你可以做return $.noConflict();,它会保留window.jQuery。这样 jQuery 插件应该都可以正常加载(我相信仅作为 shims)并且您仍然可以拥有一个干净的 $(供其他库使用。)
  • 已编辑以反映该选项。
  • 我需要在$.noConflict() 调用之后添加delete window.$,因为它被设置为undefined,mocha 会将其报告为全局泄漏。
  • MAPPING MODULES TO USE NOCONFLICT 来自 requirejs 站点
【解决方案2】:

我正在使用这个:

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;

});

【讨论】:

  • 我认为 $ 仍然会在你的方法的全局范围内(即使你没有命名参数 $),这是 mrok 试图避免的
  • 不是。测试它以确保:''Uncaught ReferenceError: $ is not defined
  • 我认为没有办法在不将 $ 添加到全局范围的情况下加载 jquery。我的情况是我已经加载了 jquery1.4.2,我想在无冲突模式下使用最新版本(由 require 加载)。克里斯,我尝试了您的代码,并且 $ 已加载到全局范围内 - 所以我不知道您是如何得到“$ 未定义”的,也许您在加载它之前尝试过使用它? github.com/mrok/require
  • 你可能永远不会得到 undefined 因为 $ 被某些调试器使用,我相信,即使没有加载 jQuery。你会看到类似 function $() { [Command Line API] } 的东西,但这不是 jQuery。
猜你喜欢
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多