【问题标题】:Accessing backbone object inside requireJS without defining it访问 requireJS 中的主干对象而不定义它
【发布时间】:2015-08-09 18:28:25
【问题描述】:

我将 RequireJS 与 Backbone.js 一起使用。

在 index.html 中,我链接 require.js 并定义入口点 start.js:

<script src="/app/vendor/require.js" data-main="/app/start"></script>

在 start.js 中,我配置 RequireJS 以访问 Backbone 库及其依赖项:

require.config({
  paths: {
    jquery: 'vendor/jquery',
    underscore: 'vendor/underscore',
    backbone: 'vendor/backbone'
  },
});

要在此文件中使用 Backbone 模块,我可以将其定义为依赖项:

require(['backbone'], function (Backbone) {
  console.log(Backbone);
});

但我定义为以 Backbone 作为其依赖项的依赖子模块

start.js:

require.config({
  paths: {
    jquery: 'vendor/jquery',
    underscore: 'vendor/underscore',
    backbone: 'vendor/backbone'
  },
});

require(['child'], function (Child) {
  console.log(Backbone);
});

child.js:

define(['backbone'], function (Backbone) {});

为什么不用定义就可以在 start.js 中访问 Backbone 模块?如果我将使用任何其他自定义模块,我将收到错误消息。这仅适用于 Backbone 模块。

【问题讨论】:

    标签: javascript backbone.js requirejs dependencies


    【解决方案1】:

    您的require 调用需要您的child 模块,该模块需要backbone,因此在加载child 并执行回调时,已经加载了backbone 模块。现在,让我们看看这个模块做了什么:

    if (typeof define === 'function' && define.amd) {
      define(['underscore', 'jquery', 'exports'], function(_, $, exports) {
        // Export global even in AMD case in case this script is loaded with
        // others that may still expect a global Backbone.
        root.Backbone = factory(root, exports, _, $);
      });
    ...
    

    如您所见,即使您将 Backbone 作为 AMD 模块加载,它仍会将符号 Backbone 导出到全局空间中。 (root 变量相当于浏览器中的 window 或 Node.js 中的 global。)这就是您的代码有效的原因。

    对于我自己的工作,我会这样写调用:

    require(['backbone', 'child'], function (Backbone, Child) {
    

    以免依赖全局符号。 Backbone 的未来版本可能在检测到它们作为 AMD 模块加载时停止导出全局符号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-02
      • 2014-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-02
      相关资源
      最近更新 更多