我刚尝试升级到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
的经典案例吗?如果是这样,我如何修改我的代码来执行此操作?
答案 0 :(得分:3)
答案最初是为Backbone 1.1.2和较旧版本的Underscore编写的。
最新版本支持AMD,不需要shim
设置。您还应该使用模块的所有小写名称:backbone
和underscore
,因为其中一些名称是硬编码的。 (您可以使用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,因此它的垫片不需要依赖它。