为什么RequireJS没有加载这种依赖?

Nar*_*esh 2 amd requirejs backbone.js

执行以下'main'模块时,我得到一个"TypeError:OrdersPage不是构造函数"

require(
    [
        'app/pages/orders/OrdersPage'
    ],
    function(OrdersPage) {
        'use strict';

        new OrdersPage();
    }
);
Run Code Online (Sandbox Code Playgroud)

事实证明,当我在函数内部(OrdersPage)时,"OrdersPage"未定义.所以问题是为什么它是未定义的 - 尽管将OrdersPage定义为依赖?

这是OrdersPage的代码,它实际上是被击中的,但是在打印出上述错误之后:

require(
    [
        'backbone'
    ],
    function() {
        'use strict';

        console.log('In OrdersPage');

        return Backbone.View.extend({

        });
    }
);
Run Code Online (Sandbox Code Playgroud)

总之,控制台输出如下:

TypeError: OrdersPage is not a constructor
In OrdersPage
Run Code Online (Sandbox Code Playgroud)

这告诉我在加载并执行'main'模块后正在加载OrdersPage模块,这已经太晚了!

编辑1 此处 提供一个演示此问题的非常简单的项目.

编辑2 我已经在RequireJS配置中声明了Backbone:

require.config({
    // Initialize the application with the main application file
    deps: ['main'],

    paths: {
        // jQuery
        jquery:                      'vendor/jquery-1.8.3',

        // Underscore
        underscore:                  'vendor/underscore-1.4.3',

        // Backbone
        backbone:                    'vendor/backbone-0.9.9',

        // Templating
        handlebars:                  'vendor/handlebars-1.0.rc.1'
    },

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

        handlebars: {
            exports: 'Handlebars'
        },

        underscore: {
            exports: '_'
        }
    }
});

require(
    [
        'app/pages/orders/main'
    ],
    function() {
        'use strict';
    }
);
Run Code Online (Sandbox Code Playgroud)

log*_*yth 5

你应该使用define(),而不是require().它们非常相似,但require()不会对返回的值执行任何操作,也不会设置模块.

define(['backbone'], function() {
    'use strict';

    console.log('In OrdersPage');

    return Backbone.View.extend({

    });
});
Run Code Online (Sandbox Code Playgroud)