ajax|指令碼
對Ajax的研究有了一段時間了,從最初的遠觀,到近看,再到實際動手實現,認識越來越深,想法也越來越多。特別是曾經有一陣子跑去研究web2.0,更是體會到Ajax背後的偉大,暗自為其慶幸,也越來越看好Web。
不過Ajax在我心中卻有些怎麼也擺脫不了的陰影。
忽如一夜春風來,Ajax就這麼很突兀的就突然流行起來。同時流行的還有Web2.0,這些詞彙現在都無比的有鼓動力,任何事物,只要沾上這兩者的邊,便變得神秘無比,無法遏制。
但也有人說Ajax是噱頭,因為他是新瓶裝舊酒。
其實Ajax之所以風行,就在於它新瓶裝舊酒。Ajax所代表的3個概念,非同步、Javascript、XML,應該說都不是新東西。
非同步?在作業系統中我們早已經學過,那時的名字叫多線程。
Javascript?想當年的DHTML他就已經紅遍大江南北。
XML?瞧瞧那些名詞,SOAP、RSS、WAP等,這些名詞哪個離開得了XML?
這些名詞結合在一起之所以產生強大的力量,就在於他們的設計不同,而隱藏在設計背後的思想不同。
而這些名詞之所以可以紅火,就在於他們本身已經應用非常普遍,已經深入到世界中的每個角落。
即便是Ajax中稍微新鮮點的XMLHttpRequest,之前也不是沒有替代品。IFrame時代我們就已經實現了同樣的功能,只是XMLHttpRequest可以比我們做的更好,協助我們做的更多而已。
Javascript是將Ajax所有技術糅合在一起的黏著劑。所謂的Ajax應用程式,其實就是一個運行在用戶端瀏覽器環境中的應用程式。這個應用程式通過DOM操作HTML將資訊展示給使用者,通過事件機制相應使用者操作,通過XMLHttpRequest與伺服器溝通,使用的協議是HTTP,資料的載體是XML,而這個應用程式就是由Javascript構成的。
Javascript是一種非常強大的語言,換句術語,是通用語言(general language)。Javascript有很多方便的並且強大的特性,使得我們可以開發功能豐富的產品。不過Javascript是指令碼,還是指令碼,這是他永遠逃不開的厄運。
指令碼有很多的問題,比如本身不夠嚴格,執行緩慢的特點等,這裡只討論一下代碼重用問題。
當應用越來越複雜,代碼越來越多時,代碼重用就會變得很重要。最低級的代碼重用就是原始碼級的代碼重用,靈活,但卻代價很高。比較先進的平台,比如java和.net都已經提供了更進階的代碼重用,中間代碼級的,甚至目標代碼級的。甚至,在.net平台,按照微軟的偉大設想,不同語言的代碼都可以統一起來,一起運行。可想而知,這會為.net平台帶來多大的戰鬥力。不同語言,不同的平台的代碼都可以在這裡施展拳腳。整合是現在的主旋律,.net有著更美好的未來(按照設想)。
相比之下,作為指令碼的Javascript這方面就要差距好多。在我們之前應用程式規模不大時,沒有人會在意。但是,當我們實現大量的Ajax應用時,當我們逐漸豐富我們的用戶端時,我們就會發現Javascript的硬傷,也就是指令碼的硬傷。當然,我們可以改造Javascript,讓他適應我們的需求,但是那時,你會突然發現,Javascript(如果那個時候還叫這個名字的話)已經不再是指令碼了。
換句話說,指令碼的特點就是靈活,所以它是用來處理一些靈活,但是開發成本低的情況。而傳統的程式語言比較嚴格,開發成本高,但是他的運行和維護成本會低。 於是,當我們意識到Ajax背後是一種客戶段能力的提高,伺服器端相應功能向用戶端轉移之時,我們便不得不重新審視一下Javascript在其中的尷尬位置。Javascript之所以在Ajax應用中如此受寵,便在於它的靈活。靈活的Javascript獲得福士的喜愛,逐漸成為標準。Ajax採用Javascript才能迅速的得以應用,成為今天的寵兒。反過來說,正式因為Javascript的靈活,決定它註定無法大型化,也就決定了Ajax的明天不會樂觀。(如果他還依靠Javascript,還叫Ajax,而不是AC(#)ax的話。)
看看Ajax背後的競爭者,micromedia的flash,java的web start,甚至.net都有可能成為他的強大敵人。微軟在宣傳它下一代作業系統的時候,著重講到了他的表現層。想象一下,當所有的IE都支援微軟最新的表現層技術時,誰還用Javascript?誰還用Ajax?
不過即使Ajax倒下,不過不要緊,它本身就是一個過渡性技術。不過,Ajax所要做的,就是給我們洗腦:
Ajax告訴我們,重視指令碼,因為他們靈活。
Ajax告訴我們,重視使用者,因為他們掏錢。
Ajax告訴我們,重視互動,因為軟體就是服務。
Ajax告訴我們,重視Web,因為方便比什麼都重要。
Ajax告訴我們,摘下眼罩,換種方式思考問題吧。當你背過臉無視世界的變化時,是世界拋棄了你,而不是你以為的掩耳盜鈴。