2015-04-01 45 views
1

我想限定A,但A应要求B和B需要C(用于r.js起见)requirejs定义:嵌套依赖性

任何这些两个是正确的吗?

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; 
     }); 
    }); 
}); 

回答

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将启动您的应用程序模块。这种方法的缺点是,如果你像我一样,最终你会忘记在你需要main之前需要C

+0

或简单地在'require.config'中使用'deps:[“C”,“main”]'_(注意:与'shim',''path'或'baseUrl'具有相同等级的'deps' ...等等..)_,我认为这应该是简短和清晰的。 – 2015-04-01 10:44:14

+0

@LinhPham'deps:[“C”]'is * asynchronous *。没有时间保证'C'将被加载。所以,如果你调整我的最后一个例子来使用'deps:[“C”]'而不是'require(['C'],...''有可能是'require(['main'])'将会执行*之前*'C'被加载。 – Louis 2015-04-01 10:46:39

+0

这是非常有用的信息,所以为了使用'deps:[“C”,“main”]'我需要为'main'模块配置'shim',例如:'shim:{“main”:[ C“]}'对吗? – 2015-04-01 10:48:53

1

只是把DEPS里面定义块,像这样:

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

    return A; 
}); 

如果你的模块B取决于C那么你应该配置在您require.config像下面

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

这是一个好主意。不幸的是我无法使用它。 C就像一个库模块,如果我使用这个,我应该添加数百个shim配置。 – eugene 2015-04-01 09:25:13

+0

你的意思是'C'将在全局使用,并且所有模块都依赖于它? – 2015-04-01 10:07:16

+0

C不是全局的,但它被这么多模块需要,所以我不会尝试在shim配置中列出它们。 – eugene 2015-04-02 05:19:20