2012-12-10 54 views
2

我已經使用build.dojotoolkit.org(我的第一次嘗試)創建了多層構建,包含3個層:dojo.js,dojox.js,dijit.js。每個js文件都上傳到自己的文件夾中(dojo,dojox,dijit)。在錯誤位置尋找模塊的代碼

當我運行代碼時,我期望它在dijit.js中查找以獲取像dijit.form.TextBox這樣的表單模塊。但是,它會嘗試加載dijit/form/TextBox.js,當然最終會出現404錯誤。

我在做什麼錯?

的文件是在這裏,如果有幫助: http://usermanagedsolutions.com/Demos/Pages

回答

1

手動包括在網頁上的腳本標籤中的每個層。

<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允許您編寫可在任一環境(使用內置文件或單個文件)中運行而無需進行修改的代碼。

+0

我必須錯過一些東西。如果我需要預先加載我的腳本,AMD有什麼意義?我的頁面有兩種模式(表單或圖表),我的假設是,當我需要dijit模塊時,dojo會加載dijit.js。 – Christophe

+0

增強我的答案,以解決您的問題 –

+0

謝謝格雷格,這是非常有益的。如果我理解正確,這意味着爲了進一步優化,我需要一個額外的層,然後纔會加載我需要的特定模式的js包。此外,建議將單個文件放在服務器上作爲安全網是一個很好的接觸。 – Christophe