RequireJs:使用垫片自动加载deps

dev*_*pus 8 requirejs backbone.js

我定义了一个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"
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

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

实际上这不起作用:

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

让我疑惑的是,在"backbone-boilderplate"项目中,Backbone(及其deps)可以这样使用:https: //github.com/tbranyen/backbone-boilerplate/blob/master/app/main.js

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

那么我做错了什么?

Mih*_*san 11

根据我的阅读,requirejs根据您在数组中指定的内容传递参数...因此您的调用应如下所示:

require(["app"], function (App) { // less arguments
});
Run Code Online (Sandbox Code Playgroud)

或者像这样:

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


jak*_*kee 5

$, _, Backbonerequire扩展路由器的-function中删除-parameters .填充程序导出全局值,因此无需像常规依赖项那样引用它们requiredefine调用它们.

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