【问题标题】:RequireJs: Use autoloading-deps with shimRequireJs:使用带有 shim 的 autoloading-deps
【发布时间】:2012-07-08 12:52:34
【问题描述】:

我已经定义了一个定义路径和垫片的 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"
        }
    }
});

正如您所见,当我加载主 App(-namespace) 时,最后一个“shim”声明应该使它能够访问主干(和它依赖)。

实际上这是行不通的:

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

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

甚至不必在函数中定义这个。

那我做错了什么?

【问题讨论】:

  • 尝试从扩展路由器的require 函数中删除$, _, Backbone。我认为垫片的工作原理是它们只导出不需要添加到任何调用中的全局值
  • 嘿,效果很好 :) 我什至可以在定义函数的 deps-array 中删除“backbone”关键字,尽管这在每个模块中都不起作用......你会创建一个答案吗所以我可以结束这个问题?
  • 完成,很高兴能帮上忙!

标签: backbone.js requirejs


【解决方案1】:

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

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

或者像这样:

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

【讨论】:

  • 我也同意。封装依赖是 AMD 的重点。你应该这样做
  • 虽然在这里您封装了变量,但您不符合干原则。假设突然间app 的依赖项比您在此处列出的依赖项更多。
  • 这甚至不起作用恕我直言。哪里保证在下划线之前加载jquery?或下划线后的骨干?嗯……不保证,但需要一个接一个地加载
  • 如果您需要正确的顺序,您可以通过 shim 给下划线一个 jquery 的 dep,backscore 一个下划线的 dep 和 app 一个骨干的 dep。如果您随后调用 app,它将检查是否首先加载了其他库。只需调用: require(['app'], function (App) { ... });其余的 $ 和 _ 变量应该在函数的范围内可用。
【解决方案2】:

从扩展路由器的require 函数中删除$, _, Backbone 参数。垫片导出全局值,因此无需像常规依赖项那样在 requiredefine 调用中引用它们。

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

【讨论】:

  • 一个精度:传递Backbone作为参数隐藏全局定义,你可以直接使用window.Backbone
猜你喜欢
  • 2023-01-30
  • 2016-11-03
  • 1970-01-01
  • 2013-08-17
  • 2014-04-04
  • 2012-11-02
  • 1970-01-01
  • 1970-01-01
  • 2016-09-21
相关资源
最近更新 更多