第一種方式,zkjbeyond的文章中有很詳細的說明http://m.tkk7.com/zkjbeyond/archive/2006/05/05/44676.html
簡單說,就是利用Ajax讀取包的.js文件后,直接使用eval()運行代碼。
除此外,dojo還有另一種加載方式,用在調試階段(例如使用firebug活Venkman調試dojo時都需要用到,不過我沒試過使用MSE7或Visual Studio時是否需要使用這種加載方式)。
你在加載包前,將djConfig.debugAtAllCosts設置為true,那么包的加載方式會有所變化,采用第二種方式。例如:
djConfig.debugAtAllCosts=true;
dojo.require("dojo.widget.TimBar");
dojo.hostenv.writeIncludes();
此時,dojo會使用加載brower_debug.js文件,
brower_debug.js重載了函數dojo.hostenv.loadUri,這兒,不再直接使用eval()運行,而只是把需要的包push到dojo.hostenv.loadedUris數組中。實現代碼:
var text = this.getText(uri, null, true);
var requires = dojo.hostenv.getRequiresAndProvides(text);
eval(requires.join(";"));
dojo.hostenv.loadedUris.push(uri); dojo.hostenv.loadedUris[uri] = true;
var delayRequires = dojo.hostenv.getDelayRequiresAndProvides(text);
eval(delayRequires.join(";"));
從代碼可以看出,dojo為了保證加載的順序,使用dojo.hostenv.getRequiresAndProvides函數將提前依賴的包摳出來,用遞歸提前push到dojo.hostenv.loadedUris中。
而后,在代碼最后,我們只要主動使用dojo.hostenv.writeIncludes();函數,就可一次性將被依賴的包利用document.write包含進來。
btw:
當然,這種方法有不少缺陷:
1、使用document.write方式加載包,會有延遲效應,會等待本頁面中代碼都執行完才執行包中的代碼,自己編碼時有點繞,影響可讀性;
2、從上面代碼中看出,dojo會有更多的IO操作,第一dojo已經完整讀取了包代碼,但是不馬上執行,只是用來分析依賴關系;之后,瀏覽器又要加載一次包代碼。
3、包絕對不允許循環引用。當然,從OO角度,不循環引用是好的方式
所以,這種方式只能用在調試期間