requirejs 定义:嵌套依赖

requirejs define: nested dependency

我想定义A,但是A需要B,B需要C(为了r.js)

这两个是正确的吗?

define([
    'module'
], function(module) {
    require(['C'], function() {
        require(['B'], function() {

            var A;

            return A;
        });
    });
});


require(['C'], function() {
    require(['B'], function() {
        define([
            'module'
        ], function(module) {
            var A;

            return A;
        });
    });
});

只需将 deps 放在 define 块中,如下所示:

define(["module", "B", "C"], function(module){
    var A;

    return A;
});

如果您的模块 B 依赖于 C 那么您应该在 require.config 中配置它,如下所示

shim: {
    "B": ["C"] // shorthand of "B": {deps: ["C"]}
}

您的选择都不正确。

您的首选尝试使用 return 到 return 来自异步回调的值。通常是不可能的,RequireJS 也不例外。请参阅 this question 及其答案以了解为什么会这样。

您的第二个选择是将 define 放入传递给 require 的回调中。这可能适用于某些玩具箱,但一般情况下这是行不通的。 ("toy case" 我的意思是所有条件都受到严格控制的概念验证。这种情况不能反映实际应用程序的真实情况。)

确实是您的选择:

define(["module", "B", "C"], function(module){
    var A;

    return A;
});

并且如果 B 依赖于 C 而不是 AMD 库,请为它添加一个 shim。在评论中,您反对说如果您这样做,您必须拥有 "hundreds" 个垫片。您有几个选项可以避免这些垫片:

  1. 不要使用 RequireJS 加载 C。在 RequireJS 加载到您的页面之前用 script 元素加载它。

  2. 将您的应用程序设计为仅使用一个模块启动,并要求您的应用程序在加载 C 之前启动:

    require(['C'], function () {
        require(['main']);
    });
    

    main 将是启动您的应用程序的模块。这种方法的缺点是,如果你像我一样,最终,你会在你需要 main.

  3. 之前忘记需要 C