2

我想我并不完全理解 require.js 的工作方式。这是我创建的一个简单模块:

requirejs.config({
  paths: {
    'underscore'    : 'libs/underscore-min',
    'backbone'      : 'libs/backbone-min'
  }
});

define([
  "underscore",
  "backbone"
  ], function(_, Backbone) {
    console.log(_);
    console.log(Backbone);
    var MyCollection = Backbone.Collection.extend({
        initialize: function() {
            this.on("all", function(event) {
                console.log(event);
            });
        }

    });

    return MyCollection;
});

我从我的 html 加载它:

<script data-main="js/mycollection.js" src="js/libs/require.min.js"></script>

问题是它间歇性地工作。有时 Backbone 对象在我需要时存在于函数中,有时它没有(并给我http://requirejs.org/docs/errors.html#notloaded错误)。如果我只是在浏览器中点击重新加载,我会得到 50/50 的变化。

我必须在这里遗漏一些非常基本的东西,报告的错误对我没有任何意义,我认为 require.js 机制的整个想法是只有在加载所有依赖项时才会调用我的函数。

4

2 回答 2

5

由于 Underscore 和 Backbone 没有被定义为 AMD 模块,因此 require.js 并不知道 Underscore 是 Backbone 的依赖项。所以我猜你 50% 的情况是当 Backbone 尝试使用下划线时没有加载它。

您可以使用 require.js shim 配置http://requirejs.org/docs/api.html#config-shim告诉 require.js 依赖结构。

于 2012-08-13T07:14:19.280 回答
3

我的猜测是您没有使用 AMD 版本的下划线和 Backbone。如果是这种情况并且这两个包没有被包装为 AMD 模块 - 那么用于模块的定义函数将无法正常工作。

对于非模块 js 脚本,更合适的形式是使用该require()函数。

或者 - 您可以在此处找到 AMD 版本的下划线和 Backbone。在某些时候,Underscore 和 Backbone 对 AMD 的支持被取消了。

AMD 下划线

AMD 主干

于 2012-08-12T23:09:04.973 回答