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

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

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

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

    

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完美r.js

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

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

更新更新版本

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

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

解决方案

如果使用标记加载jQuery,然后将其加载到RequireJS中,则必须采取特殊预防措施。 但是,我没有注意到你的问题中有任何表明你需要加载两个jQueries的东西。 因此,您可以使用以下技巧在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,因此它的垫片不需要依赖它。