requirejs返回undefined而没有依赖

时间:2015-03-08 04:29:41

标签: requirejs undefined marionette circular-dependency

在某些情况下,requirejs会将未定义的对象返回给我的模块。我查看了很多帖子,大部分答案都与循环依赖关系有关。但是我找不到(我已经多次检查过)。我为提交一些我试图减少到最低限度的代码而道歉。我们非常感谢任何帮助!

以下是失败的模块init_app.js

define([
  'marionette',
], function(
    Marionette
) {
  "use strict";

  var App;
  App = new Marionette.Application();
  App.addRegions({ body: "#main_body" });
  return App;
});

有时Marionette模块未定义。以下是config.js可能相关的部分:

define([], function() {
  'use strict';
  require.config({
    baseUrl: 'js',
    paths : {
      underscore : 'vendors/underscore/underscore',
      jquery : 'vendors/jquery/dist/jquery',
      backbone : 'vendors/backbone/backbone',
      marionette : 'vendors/marionette/lib/backbone.marionette',
      wreqr : 'vendors/backbone.wreqr/lib/backbone.wreqr',
      eventbinder : 'vendors/backbone.eventbinder/lib/backbone.eventbinder',
      babysitter : 'vendors/backbone.babysitter/lib/backbone.babysitter',
    },
    shim : {
      jquery : {
        exports : 'jQuery'
      },
      underscore : {
        exports : '_'
      },
      backbone : {
        deps : ['jquery', 'underscore'],
        exports : 'Backbone'
      },
      wreqr: {
        deps : ['backbone'],
        exports: 'Backbone.Wreqr'
      },
      eventbinder : {
        deps : ['backbone']
      },
      babysitter : {
        deps: ['backbone']
      },
      marionette : {
        deps: ['backbone', 'wreqr', 'eventbinder', 'babysitter'],
        exports : 'Marionette'
      },
    }
  });
});

main.js文件是

require(['config'], function() {
  require( ['app'], function (App) {
    App.start({});
  });
});

app.js文件

define([
  'init_app',
  'router',
], function(
    App,
    Router
  ) {
  "use strict";

  App.on('start', function() {
    new Router();
    Backbone.history.start();
  });
  return App;
});

路由器将定义一些可能依赖于init_app.js的东西。我特别小心,他们都没有定义app.js,这应该足以保证没有循环依赖可能导致这个错误。任何线索??

2 个答案:

答案 0 :(得分:1)

以下是我解决问题的方法:我将main.js更改为

require(['config'], function() {
  require( ['init_app'], function () {
      require( ['app'], function () {
        App.start({});
      });
  });
});

并将App放在init_app的全局范围内。这很有效,但没有解释以前的失败。

答案 1 :(得分:1)

您应该检查一下shim配置,以删除您为实际使用define的模块添加的所有填充程序。例如,jQuery使用define,因此不需要垫片。木偶也是如此。我刚刚在Bower上安装了它,并在文件的开头找到了它:

 if (typeof define === 'function' && define.amd) {
    define(['backbone', 'underscore'], function(Backbone, _) {
      return (root.Marionette = root.Mn = factory(root, Backbone, _));
    });
  }
  ...

如果您在使用的模块中看到类似的内容,或者对define进行平铺调用,则不应使用垫片。

我没有检查您使用的每个模块。请检查所有这些以确保您不在不需要的地方使用垫片。如果您使用垫片不正确,则可以获得模块的undefined值。