1、前言
?? dojo利用ajax技術,基本實現的按需要下載js文件,估計與國內jsvm有類似功能(jsvm好久沒關注了,不好亂說)。
?? a、類庫開發人員可以在dojo基礎上開發自己的javascript類庫。(dojo提供的夠多的了,并不斷擴大)?
?? b、可以按照每個頁面的需要,加載有限的類庫。
?? c、提供了很好的package機制。與java不同,采用dojo的包機制有一定寫法要求。見后面說明。
?? d、急劇縮小了類庫大小。以前寫過篇 (亂評prototype.js)中提到過。其實dojo不象我們想的那么龐大,只需要bootstrap1.js? hostenv_browser.js? bootstrap2.js實現底層代碼,其它功能代碼按需下載。很擔憂propotype.js的不斷龐大啊。
2、包加載機制源碼解讀
?? 其實包加載機制只用到bootstrap1.js? hostenv_browser.js? bootstrap2.js這三個文件。 大家可以看我 例子中 lang.htm ,動態的取lang.js,然后調用函數。使用上也比較簡單。 例子中我加了些注釋,歡迎大家拍磚。以下我說下個文件作用,以及dojo.require("");函數調用流程。
?? bootstrap1.js 啟動dojo的第一段代碼,定義了些全局變量和全局函數。主要定義了dojo.hostenv”接口“,分別由hostenv_*.js來實現。dojo并不只用在網頁環境中。
?? hostenv_browser.js,瀏覽器環境下實現dojo.hostenv的某些方法。根據navigator對象判斷當前瀏覽器的版本,類型,支持的插件....(見dojo.render對象)。還給window.onload()方法注冊了dojo的幾個方法。
?? bootstrap2.js? 定義了幾個面向類庫使用者的幾個方法。主要有? dojo.require? dojo.provide 等。這些方法其實調用bootstrap1.js中的方法。
?? 當我們調用
?? dojo.require("dojo.lang");時,有以下幾個流程。
?? a、dojo.hostenv.loadModule方法,在bootstrap1.js中,根據傳入的參數如dojo.lang,轉化成文件名? src/lang.js文件。(當然對于失敗流程,如cache檢查,異常處理等,這不具體細訴了)
?? b、dojo.hostenv.loadPath方法,得到javascript文件的url,用xmlhttp得到js文件的內容,eval(s)執行,相當于引入了該文件。
?? c、寫入cache,加標識等后續方法。告訴dojo,我們加載過這個模塊了。
?? d、關于dojo的根文件路徑比較麻煩,請讀 hostenv_browser.js 中設置djConfig["baseScriptUri"] 部分。xmlhttp中js的url是? getBaseScriptUri()+getModulePrefix+lang.js(''+'src'+'/lang.js')? 組成。
?? 具體dojo流程還是比較復雜的,還支持dojo.lang.*等,復雜的處理。
3、如何讓dojo加載自己的類庫
?? 我在附件中包括一個簡單的例子(有中文問題)。有以下幾個注意的地方。
?? a、一定要引入bootstrap1.js? hostenv_browser.js? bootstrap2.js三個文件。dojo下載壓縮包里的dojo.js包括了這三個文件,但也包括可許多你可能用不到的類庫(lang io等)
?? b、設置你的類庫”包名“。如dojo.setModulePrefix('com.founder','javascript');說明com.founder包下文件都在javascript文件夾下建立。 你的類庫必須放到javascript文件夾下面。
?? c、你的類庫文件。如javascript/myjs.js文件,必須首先聲名 dojo.provide("com.founder.myjs");你的類庫必須以com.founder.myjs開頭。
?? d、你的函數或變量必須定義為com.founder.myjs.fun。
?? e、當你調用的時候,只需dojo.require("com.founder.myjs");。這樣,myjs.js文件會下載到本地。可以直接應用了。

關于自己完成自己的類庫,建議先多讀讀dojo的其他代碼吧。這樣才能更好的應用dojo包機制。應用了dojo,可能javascript的寫法上與平時絕對不一樣,但請注意,dojo千萬別亂用,就google dojo中文文檔很少,估計國內系統也沒什么用的吧。

4、亂評dojo
a、javascript類庫的文檔實在不好弄,就dojo官方網站上轉半天也找不到個系統的介紹,中文文檔也很少。maillist到是挺活躍的。不看源代碼能用好dojo我估計懸。
b、dojo野心極大,需要做的工作還很多。無形中加大dojo的應用難度。就象java中的spring,還好有EJB這個墊腳石。可dojo,推廣難度不小啊。
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

這么多個文件,140k。其實也不大,但包括了很多模塊。估計dojo的定位就是開發"One page One Application"吧。一般的web應用程序prototype.js就夠了。
d、dojo上手相對較難,不象prototype.js。(雖然它們不是一類型的項目,但我喜歡拿一塊比較,原因之一是它們沒有服務器端的功能)。我相信dojo提供的功能能夠覆蓋prototype.js,或者我們可以自己把prototype.js移植到dojo.
e、
5、例子說明
?? 附件中例子我在源代碼中加了注釋和debug,只供大家參考。

附件