在requireJS内部访问骨干对象而不定义它

Accessing backbone object inside requireJS without defining it

本文关键字:定义 对象 requireJS 内部 访问      更新时间:2023-09-26

我使用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中访问主干模块而不定义它?如果我将使用任何其他自定义模块,我会收到错误。

你的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模块加载时停止导出全局符号。