RequireJs:使用垫片自动加载deps

时间:2012-07-09 05:57:10

标签: backbone.js requirejs

我已经定义了一个定义路径和填充程序的RequireJs配置:

require.config({
    // define application bootstrap
    deps: ["main"],

    // define library shortcuts
    paths: {
        app: "app"
        , jquery: "lib/jquery"
        , underscore: "lib/underscore"
        , backbone: "lib/backbone"
        , bootstrap: "lib/bootstrap"
    },

    // define library dependencies
    shim: {
        jquery: {
            exports: "$"
        },
        underscore: {
            exports: "_"
        },
        backbone: {
            deps: ["underscore", "jquery"],
            exports: "Backbone"
        },
        bootstrap: {
            deps: ['jquery'],
            exports: "bootstrap"
        },

        // main application
        app: {
            deps: ["backbone"],
            exports: "App"
        }
    }
});

正如您所看到的,当我加载主应用程序(-namespace)时,最后一个“shim”声明应该能够访问主干(并且它是deps)。

实际上这不起作用:

require(["app"], function($, _, Backbone, App){
    app.router = new Backbone.Router.extend({
        // routing and route actions
    });
});

让我想知道的是,在“backbone-boilderplate”项目中,Backbone(及其deps)以这种方式可用: https://github.com/tbranyen/backbone-boilerplate/blob/master/app/main.js

甚至不必在函数中定义它。

那么我做错了什么?

2 个答案:

答案 0 :(得分:11)

根据我的阅读,requirejs根据你在数组中指定的内容传递参数...因此你的调用应该是这样的:

require(["app"], function (App) { // less arguments
});

或者像这样:

require(
    ["jquery", "underscore", "backbone", "app"], // more deps
    function ($, _, Backbone, App) {
    }
);

答案 1 :(得分:5)

从扩展路由器的$, _, Backbone - 函数中删除require - 参数。填充程序导出全局值,因此无需像requiredefine调用那样引用它们,就像对常规依赖项一样。

将它们作为参数传递与全局变量混淆,最有可能导致它们未定义。