1、前言
?? dojo利用ajax技術(shù),基本實(shí)現(xiàn)的按需要下載js文件,估計(jì)與國(guó)內(nèi)jsvm有類似功能(jsvm好久沒關(guān)注了,不好亂說(shuō))。
?? a、類庫(kù)開發(fā)人員可以在dojo基礎(chǔ)上開發(fā)自己的javascript類庫(kù)。(dojo提供的夠多的了,并不斷擴(kuò)大)?
?? b、可以按照每個(gè)頁(yè)面的需要,加載有限的類庫(kù)。
?? c、提供了很好的package機(jī)制。與java不同,采用dojo的包機(jī)制有一定寫法要求。見后面說(shuō)明。
?? d、急劇縮小了類庫(kù)大小。以前寫過(guò)篇 (亂評(píng)prototype.js)中提到過(guò)。其實(shí)dojo不象我們想的那么龐大,只需要bootstrap1.js? hostenv_browser.js? bootstrap2.js實(shí)現(xiàn)底層代碼,其它功能代碼按需下載。很擔(dān)憂propotype.js的不斷龐大啊。
2、包加載機(jī)制源碼解讀
?? 其實(shí)包加載機(jī)制只用到bootstrap1.js? hostenv_browser.js? bootstrap2.js這三個(gè)文件。 大家可以看我 例子中 lang.htm ,動(dòng)態(tài)的取lang.js,然后調(diào)用函數(shù)。使用上也比較簡(jiǎn)單。 例子中我加了些注釋,歡迎大家拍磚。以下我說(shuō)下個(gè)文件作用,以及dojo.require("");函數(shù)調(diào)用流程。
?? bootstrap1.js 啟動(dòng)dojo的第一段代碼,定義了些全局變量和全局函數(shù)。主要定義了dojo.hostenv”接口“,分別由hostenv_*.js來(lái)實(shí)現(xiàn)。dojo并不只用在網(wǎng)頁(yè)環(huán)境中。
?? hostenv_browser.js,瀏覽器環(huán)境下實(shí)現(xiàn)dojo.hostenv的某些方法。根據(jù)navigator對(duì)象判斷當(dāng)前瀏覽器的版本,類型,支持的插件....(見dojo.render對(duì)象)。還給window.onload()方法注冊(cè)了dojo的幾個(gè)方法。
?? bootstrap2.js? 定義了幾個(gè)面向類庫(kù)使用者的幾個(gè)方法。主要有? dojo.require? dojo.provide 等。這些方法其實(shí)調(diào)用bootstrap1.js中的方法。
?? 當(dāng)我們調(diào)用
?? dojo.require("dojo.lang");時(shí),有以下幾個(gè)流程。
?? a、dojo.hostenv.loadModule方法,在bootstrap1.js中,根據(jù)傳入的參數(shù)如dojo.lang,轉(zhuǎn)化成文件名? src/lang.js文件。(當(dāng)然對(duì)于失敗流程,如cache檢查,異常處理等,這不具體細(xì)訴了)
?? b、dojo.hostenv.loadPath方法,得到j(luò)avascript文件的url,用xmlhttp得到j(luò)s文件的內(nèi)容,eval(s)執(zhí)行,相當(dāng)于引入了該文件。
?? c、寫入cache,加標(biāo)識(shí)等后續(xù)方法。告訴dojo,我們加載過(guò)這個(gè)模塊了。
?? d、關(guān)于dojo的根文件路徑比較麻煩,請(qǐng)讀 hostenv_browser.js 中設(shè)置djConfig["baseScriptUri"] 部分。xmlhttp中js的url是? getBaseScriptUri()+getModulePrefix+lang.js(''+'src'+'/lang.js')? 組成。
?? 具體dojo流程還是比較復(fù)雜的,還支持dojo.lang.*等,復(fù)雜的處理。
3、如何讓dojo加載自己的類庫(kù)
?? 我在附件中包括一個(gè)簡(jiǎn)單的例子(有中文問(wèn)題)。有以下幾個(gè)注意的地方。
?? a、一定要引入bootstrap1.js? hostenv_browser.js? bootstrap2.js三個(gè)文件。dojo下載壓縮包里的dojo.js包括了這三個(gè)文件,但也包括可許多你可能用不到的類庫(kù)(lang io等)
?? b、設(shè)置你的類庫(kù)”包名“。如dojo.setModulePrefix('com.founder','javascript');說(shuō)明com.founder包下文件都在javascript文件夾下建立。 你的類庫(kù)必須放到j(luò)avascript文件夾下面。
?? c、你的類庫(kù)文件。如javascript/myjs.js文件,必須首先聲名 dojo.provide("com.founder.myjs");你的類庫(kù)必須以com.founder.myjs開頭。
?? d、你的函數(shù)或變量必須定義為com.founder.myjs.fun。
?? e、當(dāng)你調(diào)用的時(shí)候,只需dojo.require("com.founder.myjs");。這樣,myjs.js文件會(huì)下載到本地??梢灾苯討?yīng)用了。
關(guān)于自己完成自己的類庫(kù),建議先多讀讀dojo的其他代碼吧。這樣才能更好的應(yīng)用dojo包機(jī)制。應(yīng)用了dojo,可能javascript的寫法上與平時(shí)絕對(duì)不一樣,但請(qǐng)注意,dojo千萬(wàn)別亂用,就google dojo中文文檔很少,估計(jì)國(guó)內(nèi)系統(tǒng)也沒什么用的吧。
4、亂評(píng)dojo
a、javascript類庫(kù)的文檔實(shí)在不好弄,就dojo官方網(wǎng)站上轉(zhuǎn)半天也找不到個(gè)系統(tǒng)的介紹,中文文檔也很少。maillist到是挺活躍的。不看源代碼能用好dojo我估計(jì)懸。
b、dojo野心極大,需要做的工作還很多。無(wú)形中加大dojo的應(yīng)用難度。就象java中的spring,還好有EJB這個(gè)墊腳石??蒬ojo,推廣難度不小啊。
c、下載包中壓縮版dojo.js包括了../src/bootstrap1.js,../src/hostenv_browser.js,../src/bootstrap2.js,../src/lang.js,../src/string.js,../src/io.js,../src/dom.js,../src/io/BrowserIO.js,../src/event.js,../src/event/topic.js,../src/event/browser.js,../src/event/__package__.js,../src/alg/Alg.js,../src/alg/__package__.js,../src/uri/Uri.js,../src/math.js,../src/graphics/color.js,../src/style.js,../src/html.js,../src/math/curves.js,../src/animation/Animation.js,../src/animation/__package__.js,../src/fx/html.js,../src/fx/__package__.js,../src/graphics/htmlEffects.js,../src/graphics/__package__.js
這么多個(gè)文件,140k。其實(shí)也不大,但包括了很多模塊。估計(jì)dojo的定位就是開發(fā)"One page One Application"吧。一般的web應(yīng)用程序prototype.js就夠了。
d、dojo上手相對(duì)較難,不象prototype.js。(雖然它們不是一類型的項(xiàng)目,但我喜歡拿一塊比較,原因之一是它們沒有服務(wù)器端的功能)。我相信dojo提供的功能能夠覆蓋prototype.js,或者我們可以自己把prototype.js移植到dojo.
e、
5、例子說(shuō)明
?? 附件中例子我在源代碼中加了注釋和debug,只供大家參考。
附件