3

我有一个 Backbone 应用程序,它Backbone is not defined从我的代码中使用 Backbone 的不同位置获取非确定性错误。有时它会先加载,然后网站加载,有时则不会。我使用以下作为我的 main.js:

require.config({
  paths: {
    jqueryui: 'libs/jquery/jquery-ui',
    underscore: 'libs/underscore/underscore-min',
    backbone: 'libs/backbone/backbone-min',
    text: 'libs/require/text',
    order: 'libs/require/order',
    searchcollector: 'libs/jquery/searchcollector.plugin',
    guiders: 'libs/jquery/guiders'
  },
  shim: {
    'underscore': {
      exports: '_'
    },
    'backbone': {
      deps: ['underscore'],
      exports: 'Backbone'
    }
  }
});

require([
  'views/app',
  'helpers'
], function(app) {
  var app = window.app = new app();
});

我在用着

<script data-main="/assets/js/main" src="/assets/js/libs/require/require-jquery.js"></script>

在我的 HTML 中,所以 jQuery 加载了 require。我从这个(http://stackoverflow.com/questions/8131265/loading-backbone-and-underscore-using-requirejs)SO线程中得到了这个建议,但似乎没有任何效果。Shim 不应该先加载 Backbone,然后使其全局可用吗?任何帮助表示赞赏。

4

2 回答 2

3

不确定这是否是正确的答案,但我注意到您没有将 jquery 列为 Backbone 依赖项。虽然 Backbone 将 Underscore 列为唯一的硬依赖项,但 Backbone.View 需要 jquery 或 zepto 才能工作。

但为什么,它似乎在某些时候有效?

可能是因为 jQuery 是一个 AMD 模块,所以当您加载时,它有时会先加载,而其他时候则不会。当它在 Backbone 之前加载时,它是可用的并且 Backbone 很高兴。否则,也许,你得到的坏结果。

尝试这样的事情:

在您的路径中添加以下内容:

jquery: 'libs/require/require-jquery'

在您的垫片中,添加以下内容:

'backbone': {
  deps: ['underscore', 'jquery'],
  exports: 'Backbone'
}

让我知道你得到的结果。我从未使用过 requirejs2.0 的 shim 功能,所以我很好奇我是否正确理解了更深层次的东西。

于 2012-08-14T01:41:55.190 回答
0

在我看来,在同一个文件中加载 require 和 jquery 有点麻烦。

并且将 jquery 设置为 Backbone 的 deps 是 false 因为 Underscore 需要 jquery,并且它是在 Backbone 之前加载的,所以正确的方法是这样的

require.config({
  paths: {
     'jquery': 'path to jquery'
    ,'underscore': 'path to underscore'
    ,'backbone': 'path to backbone'
    **other paths...**
  }
  ,shim: {
     jquery: {
      exports: '$'
    }
    ,'underscore': {
      deps: [ 'jquery' ]
      ,exports: '_'
    }
    ,'backbone': {
      deps: [ 'underscore' ]
      ,exports: 'Backbone'
    }
  }
});

最后你的标签脚本将是

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

然后你只需要像这样调用你需要的lib

define( [ 'jquery', 'underscore', 'backbone' ],
  function( $, _, Backbone )
  {
    // stuff
  } );

对于一个模型,你可能不需要 jquery 和下划线,所以只需调用 Backbone 就可以了

define( [ 'backbone' ],
  function( Backbone )
  {
    // Backbone.extend ?
  } );
于 2013-11-19T12:30:21.870 回答