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