2013-03-08 91 views
2

在requirejs,你可以定義一個模塊沒有設置它的名字從字面上看,例如:requirejs如何確保爲匿名模塊正確設置模塊名稱?

//in a.js 
define([/*deplist*/],function(){ 
    /*do something*/ 
}); 

//in b.js 
define([/*deplist*/],function(){ 
    /*do something*/ 
}); 

而且requirejs將根據其文件名(「A」和「B」)設置的模塊名稱。 Requirejs全部添加<script>標記您的應用程序需要,它們不會按順序加載(如網絡時間表所述)。

js file loading timeline

當被叫define模塊來定義自身,它毫不知情的模塊名稱,然後把自己的defQueue等待初始化。初始化將在加載事件處理程序中完成,因爲在事件處理函數中,節點引用是可訪問的,並且模塊名稱是節點屬性上的記錄(如下所示:<script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="a" src="./a.js"></script>)。

問題出在這裏,我們無法確保模塊調用define的順序與模塊的節點load事件觸發相同。那麼模塊名稱如何才能正確映射到模塊工廠?

回答

1

事實證明,js評估和它的引用節點「加載」事件觸發順序是巧合的。

加載模塊js文件後,其內容將被評估(不確定何時,但將按照加載的js文件的順序進行評估),然後requirejs會將工廠和依賴列表推送到FIFO隊列中。瀏覽器將按照加載的js文件的相同順序觸發節點加載事件,並且requirejs鏈接模塊ID,並在「加載」事件處理程序中將其加入工廠。例如,如果在b.js之前加載了a.js,那麼a.js的內容將不晚於b.js的評估,並且a.js的「加載」事件處理程序將不晚於b.js的。那麼可以肯定的是,模塊的ID映射將他們的工廠和依賴列表。