Underscore的RequireJS shim配置

时间:2013-05-03 08:43:08

标签: javascript requirejs

RequireJS提供了一个shim配置,用于加载不支持AMD的传统/旧版库。 shim配置允许将所述库导出到变量。

'backbone' : {
            deps : ['underscore', 'jquery'],
            exports : 'Backbone'
}

如上所示,Backbone不兼容AMD,因此shim配置用于将库导出到变量。同样,这可以为Underscore完成。

'underscore' : {
            exports : '_'
}

但即使我们没有为Underscore指定shim配置,它仍然可以正常工作。怎么样 ?有人可以对此有所了解吗?

2 个答案:

答案 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(_) {

})