【问题标题】:RequireJS shim config for Underscore下划线的 RequireJS 垫片配置
【发布时间】:2013-05-03 08:43:07
【问题描述】:

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

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

如上所示,Backbone 与 AMD 不兼容,因此 shim 配置用于将库导出到变量。下划线也可以这样做。

'underscore' : {
            exports : '_'
}

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

【问题讨论】:

    标签: javascript requirejs


    【解决方案1】:

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

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

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

    所以回答你的问题。如果您没有为下划线提供 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');
    

    以上是需要下划线的主干源代码的摘录。 从上面的 cmets 可以明显看出,这个要求是针对服务器端的。 在浏览器中的根对象是指窗口。因此,您的第一次检查“!_”在浏览器中返回 false,因为 _ 在 gloabl 对象(即窗口)中可用。所以浏览器中不会发生要求(如果下划线已经存在)。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 我还是不明白,因为即使我们没有为下划线指定垫片,当骨干内部需要下划线时,它是如何工作的?主干源代码显示它需要下划线。
      • Backbone 只需要 _ 是全局变量。应该在 Backbone 之前包含下划线脚本才能正常工作。
      猜你喜欢
      • 2015-02-04
      • 2013-10-06
      • 2013-11-28
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-10
      相关资源
      最近更新 更多