Javascript requirejs定义:嵌套依赖项

Javascript requirejs定义:嵌套依赖项,javascript,requirejs,Javascript,Requirejs,我想定义A,但A应该需要B,B需要C(为了r.js) 这两者中有一个是正确的吗 define([ 'module' ], function(module) { require(['C'], function() { require(['B'], function() { var A; return A; }); }); }); require(['C'], function() {

我想定义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
从异步回调返回值。这通常是不可能的,RequireJS也不例外。请参阅及其答案,了解为什么会这样

您的第二个选择将
define
放在传递给
require
的回调中。这可能在一些玩具箱中起作用,但一般来说,这是行不通的。(我所说的“玩具箱”是指在所有条件都受到严格控制的情况下进行概念验证。这种情况不能反映实际应用的现实。)

这是你的选择:

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

    return A;
});
如果
B
依赖于
C
且不是AMD库,则为其添加垫片。在一篇评论中,你反对说如果你这样做,你必须有“数百”个垫片。您有几个选项可以避免使用这些垫片:

  • 不要用RequireJS加载
    C
    。在页面上加载RequireJS之前,使用
    脚本
    元素加载它

  • 将应用程序设计为仅使用一个模块启动,并要求在启动应用程序之前先加载
    C

    require(['C'], function () {
        require(['main']);
    });
    
    main
    将是启动应用程序的模块。这种方法的缺点是,如果你像我一样,最终你会忘记在你需要
    main
    之前需要
    C


  • 那是个好主意。不幸的是我不能用它。C就像一个库模块,如果我使用它,我应该添加数百个shim配置。你的意思是
    C
    将被全局使用,并且所有的模块都依赖于它吗?C不是全局的,但它是如此多的模块所需要的,所以我不会尝试在shim配置中列出它们。或者简单地使用
    deps:[“C”,“main”]
    require.config
    中(注意:
    deps
    shim
    处于同一级别,
    path
    baseUrl
    等),我认为这应该简短而清晰。@LinhPham
    deps:[“C”
    是异步的。没有时间点可以保证加载
    C
    。因此,如果您将我的上一个示例改编为使用
    deps:[“C”]
    而不是
    require(['C']),那么,…
    很可能在加载
    C
    之前执行
    require(['main'])
    。这是非常有用的信息,因此为了使用
    deps:[“C”,“main”]
    我需要为
    main
    模块配置
    shim
    ,比如:
    shim:{“main”:[“C”}
    对吗?是的,如果
    main
    恰好是一个非AMD模块。我在回答中没有明确说明它,但
    main
    应该是一个AMD模块,因为它是为OP开发的应用程序创建的。您的第二个选项是我改编的。