RequireJS + Backbone + jQuery通过`script`加载干扰通过RequireJS加载的jQuery

时间:2014-04-11 21:49:12

标签: jquery backbone.js requirejs

我刚尝试升级到Backbone 1.1.2,并且遇到了jQuery问题。

默认情况下,Backbone希望在基目录中找到./jquery.js的jQuery。当我将它添加到RequireJS路径并将其作为Backbone的依赖项添加到垫片时,所有内容都在require内部工作,但在外部,没有任何作用。好像我正在创建的本地引用是在重写全局包含的jQuery?

在我的html页面中,我有这个:

<script src="js/lib/jquery/2.0.2/jquery.min.js"></script>
<script src="js/lib/jqueryui/{$jquery.ui.version}/jquery-ui.min.js"></script>
<script data-main="js/homepage" src="js/lib/require/2.1.11/require.min.js"></script>

homepage.js(目前有效)看起来像这样:

require.config({
    baseUrl: "./js",
    paths: {
    Underscore: 'lib/underscore/1.6.0/underscore-min',
    Backbone: 'lib/backbone/1.0.0/backbone-min'
    // ,jquery: 'lib/jquery/2.0.2/jquery.min'
    // ,jqueryui: 'lib/jqueryui/1.10.3/jquery-ui.min'

},

shim: {
    // 'jqueryui': {
    //  deps: ['jquery'],
    //  exports: "$"
    // },
    'Underscore': {
        // deps: ['jquery'],
        exports: "_"
    },
    'Backbone': {
        deps: ['Underscore', /*'jquery'*/],
        exports: 'Backbone'
    }

}

});

require([ 'views/homepage/main' ], function(Main) {

});

在这种情况下,我正在使用全局jQuery,它在应用程序内部和我使用jQuery的站点导航全局工作。 js也与r.js完美缩小。

但是,当我将BB版本更改为1.1.2时,它表示无法找到jquery.js。当我取消注释homepage.js中的所有行以包含jQuery依赖项时,所有内容都在应用程序中呈现,但现在我的导航中断,说我创建的jQuery函数未定义。我也无法在r.js缩小我的应用。

这让我相信当RequireJS开始下载其依赖项时,全局命名空间中的jQuery$正在被踩踏。这只是需要使用$.noConflict的经典案例吗?如果是这样,我如何修改我的代码来执行此操作?

1 个答案:

答案 0 :(得分:3)

更新最新版本

答案最初是为Backbone 1.1.2和较旧版本的Underscore编写的。

最新版本支持AMD,不需要shim设置。您还应该使用模块的所有小写名称:backboneunderscore,因为其中一些名称是硬编码的。 (您可以使用map配置来解决硬编码问题,但使用标准的全小写名称会更简单。)

解决方案

如果您使用<script>标记加载jQuery,然后将其加载到RequireJS中,则必须采取特殊预防措施。但是,我没有注意到您的问题中有任何内容表明您需要加载了两个jQuery。因此,您可以使用以下技巧在AMD模块外部和内部使用相同的jQuery实例:

define('jquery', [], function () {
    return jQuery;
});

require.config({
    baseUrl: "./js",
    paths: {
        Underscore: 'lib/underscore/1.6.0/underscore-min',
        Backbone: 'lib/backbone/1.1.2/backbone-min'
    },

    shim: {
        Underscore: {
             exports: "_"
        }
    }

});

require([ 'views/homepage/main' ], function(Main) {

});

这样当RequireJS“加载”jquery模块时,它将执行传递给上面define的代码。我记得,jQuery UI只是将自己安装为jQuery插件,因此您不需要对它做任何特别的事情。另外我建议使用Backbone 1.1.2,它不需要垫片。 Underscore不依赖于jQuery,因此它的垫片不需要依赖它。