2013-05-03 87 views
2

RequireJS提供了用于加载不支持AMD的传统/旧式库的Shim配置。 shim配置允许将所述库导出到变量。RequireJS Shim配置为下划线

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

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

'underscore' : { 
      exports : '_' 
} 

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

回答

3

骨干有下划线的依赖。没有必要通过需求和其他东西(如垫片)来获得这种依赖关系。
骨干只能期望_在全局命名空间中包含下划线库的接口。

当您需要主干时,我们作为应用开发人员使用shim选项和deps属性来提供依赖关系,以说明此特定模块的所有依赖关系。

只有在引用非AMD模块(如主干或_)时,exports属性才能告诉require使用全局名称空间中的属性。

所以要回答你的问题。如果你没有提供shim config下划线,你的下一行将失败。

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对象窗口中可用。所以这个require不会在浏览器中发生(如果下划线已经存在)。

2

它的工作原理是因为下划线定义了在Backbone中使用的全局变量_,而Backbone的shim配置正确设置了依赖关系,因此下划线和jquery在Backbone之前加载。

但是,如果你没有为下划线垫片配置,然后尝试将其导入您的模块中它不应该工作:

define(['underscore'], function(_) { 

}) 
+0

我还是不明白,因为即使我们没有指定用于下划线的填充,当骨干在内部需要下划线时,它是如何工作的?主干源代码显示它需要下划线。 – SrikanthManian 2013-05-03 09:28:09

+0

主干只需要'_'作为全局变量。在Backbone正常工作之前,应该包含下划线脚本。 – 2013-05-03 09:52:01