RequireJS提供了一个shim配置,用于加载不支持AMD的传统/旧版库。 shim配置允许将所述库导出到变量。
'backbone' : {
deps : ['underscore', 'jquery'],
exports : 'Backbone'
}
如上所示,Backbone不兼容AMD,因此shim配置用于将库导出到变量。同样,这可以为Underscore完成。
'underscore' : {
exports : '_'
}
但即使我们没有为Underscore指定shim配置,它仍然可以正常工作。怎么样 ?有人可以对此有所了解吗?
答案 0 :(得分:3)
Backbone具有下划线的依赖性。没有必要通过需求和垫片等其他东西来获得这种依赖性 Backbone只希望_在包含下划线库接口的全局命名空间中。
当您需要主干时,我们作为app开发人员使用shim选项和deps属性提供依赖关系,以告知该特定模块的所有依赖关系。
exports属性只是一种告诉require在引用非AMD模块时使用全局命名空间中的属性的方法,例如backbone或_。
所以回答你的问题。如果您没有为下划线提供垫片配置,则以下行将失败。
var _ = require('underscore');
在这种情况下,本地命名空间中的变量_将是未定义的,而主干将使用全局命名空间中的_。
回答你的疑问。它如何在骨干源中发挥作用。
// Require Underscore, if we're on the server, and it's not already present.
var _ = root._;
if (!_ && (typeof require !== 'undefined')) _ = require('underscore');
以上是需要下划线的主干源的摘录。 从上面的评论中可以明显看出,这需要服务器端。 浏览器中的根对象是指窗口。所以你的第一次检查“!_”在浏览器中返回false因为_可用于gloabl对象aka窗口。因此,需求不会在浏览器中发生(如果下划线已存在)。
答案 1 :(得分:2)
它的工作原理是因为下划线定义了Backbone中使用的全局变量_
,而Backbone的shim配置正确设置了依赖关系,因此在Backbone之前加载了下划线和jquery。
但如果你没有下划线的shim配置,然后尝试在你的模块中导入它,那么它应该不起作用:
define(['underscore'], function(_) {
})