requirejs define:嵌套依赖项

时间:2015-04-01 02:35:05

标签: 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() {
    require(['B'], function() {
        define([
            'module'
        ], function(module) {
            var A;

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

2 个答案:

答案 0 :(得分:4)

您的选择都不正确。

您首选尝试使用return从异步回调中返回值。这通常是不可能的,而且RequireJS也不例外。请参阅this question及其答案,了解其原因。

您的第二个选择是将define放入传递给require的回调中。这可能适用于一些玩具箱,但总的来说这不会起作用。 (通过"玩具箱"我的意思是概念验证所有条件都受到严格控制。这种情况并不反映实际应用的现实。)

Linh Pham's suggestion真的是你的选择:

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

    return A;
});

如果B取决于C并且不是AMD库,请为其填充垫片。在评论中,你反对说你必须拥有数百个"垫片如果你这样做的话。您有几个选项可以避免这些垫片:

  1. 请勿使用RequireJS加载C。在页面上加载RequireJS之前,使用script元素加载它。

  2. 将您的应用程序设计为仅使用一个模块启动,并要求先启动您的应用程序,然后再加载C

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

    main将成为启动应用程序的模块。这种方法的缺点是,如果你像我一样,最终在需要C之前忘记要求main

答案 1 :(得分:1)

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

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

    return A;
});

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

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