我使用的是require.js - 当我使用requiredjs时,我没有得到下划线和骨干,而我没有使用shim的导出模块。
但是jquery没有要求这个出口垫片依赖..那么,为什么我们需要使用垫片并将其导出为下划线和骨干?
这是我的代码:
requirejs.config({
baseUrl: 'js',
paths: {
"jquery":'lib/jquery-1.9.1.min',
"underscore":"lib/underscore-min",
"backbone" : "lib/backbone-min"
},
shim:{
"underscore":{
exports: '_'
//what is does here? without this i am getting undefined
},
"backbone":{
exports: 'Backbone'
//what is does here? without this i am getting undefined
}
}
});
require(["jquery","underscore","backbone"],function ($,_,Backbone) {
console.log($,_,Backbone);
//without shim export i am getting conosle like this:
// "function(), undefined, udefined" - why?
});
答案 0 :(得分:4)
Backbone
和underscore
不符合AMD标准,它们将自己存储在全局范围内(即在浏览器环境中的window
元素中)。 shim
元素允许通过“链接”全局变量(在下划线的情况下_
和在Backbone的情况下为Backbone
)与“导出”来公开它们的全局变量(如果它们是AMD模块) “虚拟”模块的一部分(我将其称为“虚拟”,因为这是在运行中发生的,您不必更改任何代码)。
此:
"underscore":{
exports: '_'
}
表示添加对“下划线”的依赖将获取对window._
的引用并将其作为AMD模块公开。
jQuery
不需要它,因为它检测它是否作为AMD模块加载并在这种情况下以符合AMD的方式暴露自身(向下滚动到original source code的最底部更多细节)