处理require.js

时间:2012-08-12 21:53:27

标签: backbone.js requirejs

我想我并不完全理解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机制的全部想法是只有在加载所有依赖项时才会调用我的函数。

2 个答案:

答案 0 :(得分:5)

由于Underscore和Backbone尚未定义为AMD模块,因此require.js不知道Underscore是Backbone的依赖项。所以我想50%的情况会发生在Backbone尝试使用它时没有加载Underscore。

您可以使用require.js shim config http://requirejs.org/docs/api.html#config-shim告诉require.js有关依赖结构的信息。

答案 1 :(得分:3)

我的猜测是你没有使用AMD版本的下划线和Backbone。如果是这种情况并且两个软件包没有被包装为AMD模块 - 那么用于模块的define函数就不会像它应该那样工作。

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

或者 - 你可以在这里找到AMD版本的下划线和Backbone。在某些方面,AMD支持Underscore和Backbone。

AMD Underscore

AMD Backbone