2012-08-12 54 views
2

我想我不完全理解的方式require.js作品。下面是一个简单的模块,我创建:处理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机制的整个想法是我的函数只有在加载所有依赖时才被调用。

回答

3

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

对于非模块JS脚本时,更合适的形式是使用require()功能。

或 - 你可以找到下划线和骨干的AMD版本在这里。 AMD的支持在某些时候被从Underscore和Backbone中取出。

AMD Underscore

AMD Backbone

5

由于下划线和骨干还没有被定义为AMD模块,require.js不知道下划线骨干的依赖。所以我猜想50%的情况会发生什么,当Backbone尝试使用它时,Underscore并未加载。

可以使用require.js垫片配置http://requirejs.org/docs/api.html#config-shim讲述依存结构require.js。