2

RequireJS 提供了一个 shim 配置来加载不支持 AMD 的传统/遗留库。垫片配置允许将所述库导出到变量。

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

如上所示,Backbone 与 AMD 不兼容,因此 shim 配置用于将库导出到变量。类似地,这可以为下划线完成。

'underscore' : {
            exports : '_'
}

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

4

2 回答 2

3

Backbone 具有下划线的依赖关系。不必通过 require 和其他东西(例如 shim)来获得这种依赖关系。
Backbone 只期望 _ 存在于包含下划线库接口的全局命名空间中。

当您需要主干时,我们作为应用程序开发人员使用带有 deps 属性的 shim 选项提供依赖项,以告知此特定模块的所有依赖项。

在引用非 AMD 模块时,exports 属性只是一种告诉 require 使用全局命名空间中的属性的方法,例如主干或 _。

所以回答你的问题。如果您没有为下划线提供 shim 配置,您的以下行将失败。

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

于 2013-05-03T09:28:53.290 回答
2

它之所以有效,是因为下划线定义了在 Backbone 中使用的全局变量_,并且 Backbone 的 shim 配置正确设置了依赖关系,因此下划线和 jquery 在 Backbone 之前加载。

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

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

})
于 2013-05-03T09:03:04.213 回答