requirejs returns undefined 没有依赖

requirejs returns undefined without dependency

在某些情况下,requirejs returns 一个未定义的对象到我的模块。我看过很多帖子,大部分答案都与循环依赖有关。但是我可以找到 none (我已经检查过几次)。对于粘贴我已尝试减少到​​最低限度的代码数量,我深表歉意:)任何帮助将不胜感激!

这是失败的模块 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 的东西。我一直特别小心,其中 none 定义了 app.js,这应该足以保证没有循环依赖会导致此错误。有什么线索吗??

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

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

并将 App 放在 init_app 的全局范围内。这很好用,但不能解释之前的失败。

您应该检查您的 shim 配置以删除您为实际使用 define 的模块放入的所有垫片。例如,jQuery 使用 define 因此不需要垫片。 Marionette也是如此。我刚刚用 Bower 安装了它,并在文件开头找到了它:

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

如果您在使用的模块中看到类似这样的内容,或者对 define 的直接调用,那么您不应该为它使用 shim。

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