AJAX在去年確實火爆了,作為Web2.0時代的核心技術,關注度盛況空前,至今仍餘音未絕,我一直從事於WinForm、Windows Mobile應用開發,雖然對Web開發略知一二,但從未向學習WinForm開發一樣系統的學過Web,最近閑暇之餘從頭學了學ASP.NET,到現在才真正理解清楚了諸如ViewState之類的Web工作原理,我可以肯定的說,時下的Web開發人員中還有什麼都沒理解清楚的“高手”,當然ASP.NET並不是今天討論的話題,我們直接看看Ajax吧,在理解清楚它之後你會發現,它比理解WinForm編程中的線程單元要簡單得多,就其技術本身來說並沒有什麼神秘與複雜性可言,而且其工作機制還不及三向交握的理解難度,我們並不討論實現的方法,而只對底層工作原理進行剖析,因此讀這篇文章並不需要造火箭的技術。
Ajax(Asynchronous JavaScript and XML)中文意思為非同步JavaScript 和XML,或者基於XML的非同步JavaScript.它提供了一種局部重新整理Web頁面的機制,比起傳統的整頁Load在效能上有了質的飛躍,看看GoogleMap吧,再看看Google輸入框的AutoComplete功能,相信你已經對Ajax無限神往了。每一項技術都有其發展的根源,我們追溯一下Ajax的曆史,其實這個技術最早在IE5.0中被引入,算算也是幾年前的東西了,可惜微軟當時並沒有挖掘出它的價值,直到Flickr, Backpack和Google在這方面作出了驚人的研究成果。就技術根本來說,Ajax只完成了一個功能,即用用戶端代碼(JavaScript )發送Http請求,要完成這一特殊的功能並不是我們這些普通開發人員能簡單實現的,因為它依賴於瀏覽器本身,在IE5中,微軟引入了一個XmlHttp的ActiveX對象,後來Mozilla, Safari 和其他瀏覽器紛紛仿效, 提供了XMLHttpRequest類,它支援微軟這個ActiveX對象所提供的方法和屬性.這個類使得我們用JavaScript發送Http請求成為可能。並且它提供了我們插入響應代碼的途徑。下面是前面所描述的這個對象執行機制的虛擬碼:
request = new XMLHttpRequest();
request.open('GET', 'http://localHost/xxxx.aspx, true);
request.send(null);
響應這個請求:
request.onreadystatechange = function(){
var text = request.ResponseText; //取得響應的字串
// 作出響應.....執行一些用戶端JavaScript
};
當然實際代碼比起這些代碼要複雜得多,但前面說過了,我們並不討論實現方式,而是探尋其執行原理,可見為Ajax剝下神秘面紗後赤裸裸的展示出來其簡單的原理,和C#裡的事件響應一樣,只不過這個事件是用戶端請求而服務端觸發罷了,真正的複雜性早已被微軟封裝到ActiveX對象中了,但是原理的簡單並不是說實現的簡單,實現起來確實有些難度,但是現在那麼多的AJAX架構已經為我們屏蔽了很底層的東東,實現並不在本文所談論的話題,這裡就不詳述了。
任何新技術的引入伴隨的都是痛苦的學習,我們必須掌握其實現原理,才能準確,適宜的用好這些新技術,盲目爛用只能弄巧成拙。那麼作為開發人員的我們如何應對已經到來的AJAX呢?以下是我個人理解了AJAX後的一些結論(註:本人自知技術造詣淺陋,不對之處請大家原諒):
理解Ajax解決的問題
Ajax的出現就是為了改善Web程式使用者體驗,使用者點擊頁面後的頁面重新整理延遲問題就是引入Ajax的直接理由,如果我們的程式運用AJAX並沒有改善使用者體驗的話那隻是為了Ajax而Ajax,而不是為了使用者體驗而Ajax。
Ajax的弊端
1、相容性。Ajax的立命之本是前面提到的XMLHttpRequest,然而這個對象在各個瀏覽器中不盡相同,這就增加了我們開發過程中完成一個跨瀏覽器的通用代碼的難度,而JavaScript這種語言在各種瀏覽器中對技術的支援和標準也不同,從而加劇了這種困難性。好在市面上紛繁的Ajax架構已經為我們解決了相容性問題,讓我們構建跨瀏覽器的程式變得簡單起來。
2、伺服器壓力。本人認為Ajax把用戶端請求伺服器響應這一過程變為非同步執行,一方面提高了使用者體驗,同時使得使用者請求響應的次數顯著增加,伺服器面臨的壓力也將增強,試想一下,以傳統整頁載入的方式當使用者請求一個頁面時候必然會等待頁面裝載,而Ajax使得請求發出後頁面並不需要等待,這樣使用者可以點擊其他頁面元素再次發送請求,試想一下Google的AutoComplete功能如果是連結資料庫請求的話,每次輸入都會發生這一行為,那資料庫壓力是否成倍增長?
3、語言問題。由於Ajax以JavaScript為核心,而這是一種繁雜而又易出錯的語言,它會使得我們將應用邏輯任意地散布在服務端和用戶端中,這使得問題很難被發現而且代碼很難重用。JavaScript甚至被服務端開發人員認為是一種企業級應用不需要使用的東西應該儘力避免。幸好出現了Microsoft Script Debugger等強大的JS調試器,同時VS2008的JavaScript智能功能也在為這些問題而做著努力。然而JavaScript的缺陷如雙重變數賦值(通常是由於缺少資料類型)使得偵錯工具依然面臨挑戰。
相關技術
由於XMLHttpRequest返回的響應是以字串形式出現,因此XML成為理想的選擇,Ajax中的x預示著XML將終身伴隨著Ajax,因為大多數開發人員已經掌握了這項流行的技術。對於Xml來說理解Dom是必須的,Xpath為Xml操作提供了捷徑,而XSLT為輸出Html提供了天然的溫床,因此所談到的這些技術作為Ajax開發人員必須掌握。加上新引入的XMLHttpRequest對象,和更複雜的JavaScript代碼,相信技術的學習依然會痛苦一段時間。
說到這裡已經算為Ajax開了個頭了,希望對初學Ajax的朋友能提供學習上的指引,本人也是菜鳥,望高手勿見笑。