手動包括在網頁上的腳本標籤中的每個層。
<script src="path/to/dojo.js" />
<script src="path/to/dojox.js" />
<script src="path/to/dijit.js" />
這將提供您在構建中定義的所有模塊。當你需要文本框時,Dojo會看到它有代碼並且不會進行XHR調用。
即使您沒有使用單個文件的意圖,也可能希望將它們放在服務器上。這樣,如果有人忘記將文件添加到構建中,則會導致懲罰是xhr請求,而不是javascript錯誤。
回覆:AMD
當您在我上面描述的方式你的層次,你不加載所有你包括構建模塊 - 你只是做了定義可用的功能,而無需提出xhr請求。
如果您查看從構建中輸出的js文件,則該文件包含模塊路徑的映射,以便在調用時定義該模塊。
所以當你寫下面的代碼
require(["dijit/form/TextBox"], function(TextBox){
...
});
AMD將首先確定是否dijit/form/TextBox
已經定義。如果是這樣,它只會採取對象並執行回調。
如果該模塊尚未定義,那麼AMD會查看它的緩存以查看定義代碼是否可用。當你包含你的腳本文件時,你提供了一個定義函數的緩存。 AMD發現代碼來定義模塊。它調用這個定義函數,結果是傳入回調的對象。如上所述,後續對dijit/form/TextBox
的要求也將使用此對象。
如果該模塊尚未定義,並且AMD在其緩存中未找到定義函數,則AMD將向服務器發送XHR請求以嘗試查找特定的模塊代碼。 XHR調用的結果應該提供定義函數。 AMD將調用該函數並將結果用作傳入回調的對象。同樣,後續要求爲dijit/form/TextBox
也將使用此對象。
Dojo構建提供了1)縮小代碼的能力,2)將其組合成需要從服務器請求的更少的文件。
AMD允許您編寫可在任一環境(使用內置文件或單個文件)中運行而無需進行修改的代碼。
我必須錯過一些東西。如果我需要預先加載我的腳本,AMD有什麼意義?我的頁面有兩種模式(表單或圖表),我的假設是,當我需要dijit模塊時,dojo會加載dijit.js。 – Christophe
增強我的答案,以解決您的問題 –
謝謝格雷格,這是非常有益的。如果我理解正確,這意味着爲了進一步優化,我需要一個額外的層,然後纔會加載我需要的特定模式的js包。此外,建議將單個文件放在服務器上作爲安全網是一個很好的接觸。 – Christophe