2015-04-01 69 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