2011-10-23 89 views
9

我有我的主要初始化腳本,它調用require(),其中一個依賴項是一個實用程序框架,但我指定的某些其他模塊需要)也自己將這個框架定義爲依賴關係。AMD(特別是RequireJs)如何處理多個模塊間的依賴關係

例如(init.js):

require(['module-a', 'module-b', 'module-c'], function(a, b, c){ 
    // where module-c is the framework 
}); 

然後在 '模塊 - 一個' 我有:

define(['module-c'], function(c){ 
    // utilize module-c framework 
}); 

那麼,如何AMD/RequireJs處理這種情況下,它加載兩次相同的框架?

任何幫助表示讚賞。

此致 馬克

回答

6

它只會被加載一次,上述兩個模塊中的將獲得關於「模塊C」相同的模值。

+0

非常感謝確認!這正是我希望會發生的事情,因爲在我的思想中,指定每個模塊內的依賴性更有意義,因爲這意味着我可以將該模塊取出並在另一個完全不同的項目中的其他位置重新使用它。 – Integralist

+1

在內部,AMD加載程序跟蹤(即高速緩存)所有模塊。當模塊被優化/連接在一起時,這不是很有趣。但是,如果任何模塊都是及時加載的,請務必注意,AMD加載器會跟蹤_requests_,以便兩個幾乎同時發生的請求不會嘗試多次下載相同的模塊。 – unscriptable

2

櫃面其對他人有用 - 這是我穿過其中一個模塊被加載兩次來到一個情況:

對於以下項目結構:

~/prj/js/app/fileA.js 
~/prj/js/app/util/fileB.js 
~/prj/js/ext/publisher.js 

其中RequireJs baseurl~/prj/js/app

fileA.js是指外部(ext)依賴publisher.js爲:

//fileA: 
define(['../ext/publisher'], function(){}); 

但是fileB.js指同一扶養與不同的路徑:

//fileB: 
define(['../../ext/publisher'], function(){}); 

總之,對於兩個文件中,相關性路徑是不同的雖然是扶養在相同的位置。在這種情況下,publisher.js會被加載兩次。

使用Firebug的Net標籤看到它加載兩次:

dependency.js being loaded twice (firebug)

這是很容易使用paths配置外部文件夾路徑(如require_js docs解釋)固定:

requirejs.config({ 
    paths: {ext: '../ext'} 
}); 

在設置paths之後,依賴關係僅使用與fileA.jsfileB.js相同的依賴路徑如下:

//fileA: 
define(['ext/publisher'], function(){}); 

//fileB: 
define(['ext/publisher'], function(){});