AJAX 的七宗罪
引子
2005.2.18,Jesse James Garrett 的一篇A New Approach to Web Applications引出了AJAX這個(gè)web界的新名詞。加上新寵兒在降生下來就和足球名隊(duì)阿賈克斯、Google Suggest Google Maps這些大腕息息相關(guān),不想出名都難啊。但似乎人們給與AJAX的期望有點(diǎn)太高了,甚至有人提出了用AJAX取代Java Applet和Flash。不知Flickr是不是也聽到這種呼聲才把自己的Flash UI轉(zhuǎn)向了普通的Javascript。AJAX是個(gè)偉大的東西,它是在不創(chuàng)造新技術(shù)的前提下誕生的一個(gè)標(biāo)準(zhǔn),憑這一點(diǎn)就能招來大批的狂熱追隨者,AJAX看起來更像是楊過和小龍女練得玉女素心劍一樣,分開來沒有什么破壞力,但是二者合一就威力無比。
罪之一:對(duì)搜索引擎的支持不好
這其實(shí)更像一個(gè)大大的諷刺,AJAX的鼻祖是Google,但卻對(duì)Google自己支持最不好了,GMail主界面除過Top和Bottom外沒有一個(gè)鏈接就是最形象的諷刺了。雖然Mail本身是個(gè)私人的應(yīng)用系統(tǒng),但這個(gè)無鏈接的設(shè)計(jì)界面恰恰給AJAX開了個(gè)壞頭。Flash也有同樣有這個(gè)毛病。沒有鏈接的web就像森林中迷路的羔羊,這句看似廣告語(yǔ),其實(shí)是web設(shè)計(jì)的根本原則。
罪之二:編寫復(fù)雜、容易出錯(cuò)
javascript本是是個(gè)輕量級(jí)的小東西,現(xiàn)在被強(qiáng)迫重用起來,負(fù)擔(dān)可想而知。javascript對(duì)OOP的支持很少,這就限制了javascript代碼的可重用可封裝等等,從Google Mpa還是其他一些應(yīng)用中能看到的都是無數(shù)的 這樣的文件包含,這些除了讓程序員頭昏的更快點(diǎn),一點(diǎn)好處都沒有。更可怕的是在javascript中竟然沒有一款順手的Debug軟件,很多寫js的老手到今天還是用最原始的alert("")來調(diào)試,splinetech JavaScript HTML Debugger 算是一個(gè)看起來還像個(gè)樣子的調(diào)試器吧,可惜不是免費(fèi)的,幾十大刀讓我這種窮人只能望而生嘆了。
罪之三:冗余代碼更多了
和上面說的差不多,層層包含js文件是AJAX的通病,再加上以往的很多服務(wù)端代碼現(xiàn)在放到了客戶端,所以每次打開一個(gè)頁(yè)面會(huì)包含很多的無用的js文件也一同下載下來。雖然寬帶越來越普及,但是減少代碼冗余還是每個(gè)web設(shè)計(jì)者的必修課。
罪之四:破壞了Web的原有標(biāo)準(zhǔn)
什么叫破壞web標(biāo)準(zhǔn)?點(diǎn)擊查看全部,這就是破壞了web標(biāo)準(zhǔn)。好好的A標(biāo)簽放著不用,偏要用span。這種例子很多,flickr中的標(biāo)題單擊后可以更改,這雖然(也包括我)是大家一致叫好覺得方便的設(shè)計(jì),但同時(shí)這也是歧義了web元素本身的含義,物是人非這個(gè)詞不知道用的合不合適?
罪之五:缺少一個(gè)沒有標(biāo)準(zhǔn)之爭(zhēng)、沒有back和history的瀏覽器
哈哈,這句話語(yǔ)有點(diǎn)諷刺意義。現(xiàn)在的瀏覽器市場(chǎng),不管是IE還是FireFox還是Opera等等。瀏覽器和瀏覽器之間的差異一直都是web設(shè)計(jì)者心中永遠(yuǎn)的痛,支持的css不一樣,支持的客戶端腳本不一樣,有的竟然連客戶端腳本的用法都有不同。這讓程序員非常苦惱,最明顯的就是調(diào)用xmlhttprequest了,req=(window.XMLHttpRequest)?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP");這段創(chuàng)建xmlhttp對(duì)象的代碼就是為了適應(yīng)IE和非IE兩天陣營(yíng)的瀏覽器的經(jīng)典例子。說是沒有back和沒有history的瀏覽器,這也是一個(gè)諷刺,主要是指在AJAX下點(diǎn)擊鏈接是不Redirect頁(yè)面,所以不存在后退和前進(jìn)了,同樣,沒有后退和前進(jìn)也就無存找瀏覽歷史紀(jì)錄了。back和history存在的根本就是url的改變,在AJAX下人們發(fā)現(xiàn)不改url也同樣能達(dá)到內(nèi)容改變這個(gè)酷酷的特點(diǎn),何樂而不為呢?look http://www.dux2005.org/和http://www.zagodesign.com/,我承認(rèn)這兩個(gè)站確實(shí)做得非常棒,但除了酷酷的感覺外,毫無用處。
罪之六:XML只是用來打幌子
xml從誕生那天起就被一致看好,大有非xml不娶之勢(shì),我想Jesse James Garrett也是為了趨于流行才把xml強(qiáng)行加入ajax的吧。xml有一個(gè)致命的缺點(diǎn),那就是加載的資源耗費(fèi),這好像是所有平臺(tái)下xml的通病。google map雖然是Jesse James Garrett推薦的AJAX的品牌代言人,但是gmap并沒有用xml,而是用了原生的javascript數(shù)組,我自己在用AJAX從服務(wù)端傳回?cái)?shù)據(jù)時(shí)也從來不用XML,因?yàn)樗屛腋爆嵶屜到y(tǒng)更慢。服務(wù)端首先要調(diào)用xml對(duì)要傳輸?shù)臄?shù)據(jù)進(jìn)行封裝,客戶端得到數(shù)據(jù)后再調(diào)用xml進(jìn)行解析,簡(jiǎn)直是畫蛇添足。AJAX的一個(gè)重要特點(diǎn)是要身法輕盈,數(shù)據(jù)的傳輸盡量單一和簡(jiǎn)陋,如果確實(shí)需要傳輸大量復(fù)雜的數(shù)據(jù),也應(yīng)該通過多次調(diào)用傳回。
罪之七:世界這么大卻找不到自己的家
AJAX適用于什么?能干什么?能帶來什么?在網(wǎng)站上用AJAX那是笑話,除非像Google Map和Flickr這樣的專業(yè)領(lǐng)域的網(wǎng)站外,普通網(wǎng)站根本沒必要用這個(gè)技術(shù);在龐大的企業(yè)應(yīng)用市場(chǎng)估計(jì)還能有AJAX的一點(diǎn)容身之地,不過在MS、SUN不會(huì)看著AJAX這個(gè)野孩子來在他們的地盤上撒潑的,如果大家都用AJAX,那java給誰(shuí)賣?.net給誰(shuí)賣?所以AJAX在企業(yè)應(yīng)用也不是長(zhǎng)久之地。所以,AJAX現(xiàn)在找不到自己合適的位置是個(gè)很大的尷尬。疑病亂投醫(yī),最近把AJAX的矛頭指向Flash和Applet就是一個(gè)例子。
當(dāng)然,我也不是要把AJAX扁的一無是處,我本人就非常喜歡這門技術(shù),它能讓web設(shè)計(jì)者的眼球更加寬廣,讓一些大膽的設(shè)計(jì)成為現(xiàn)實(shí),但是我也會(huì)很冷靜的小心翼翼的利用這個(gè)利器,利器雖好,一不留神刺傷的是自己。
PS:這篇文章是昨晚寫的,今早卻神奇般的從網(wǎng)上看見了一篇文章Ajax: 99% Bad,文章是針對(duì)2000年那片著名的Flash: 99% Bad 寫的,其中的觀點(diǎn)和我所說的七宗罪中的幾宗相似。
駁“AJAX 的七宗罪”
(本文轉(zhuǎn)載自“Java視線”,原文地址:http://forum.javaeye.com/viewtopic.php?t=13844,作者dlee)
(AJA X的七宗罪:http://news.csdn.net/news/newstopic/22/22216.shtml)
我不帶任何主觀色彩來評(píng)一下這個(gè)所謂的 “AJAX 的七宗罪”。
1、連帶著 Flash 和 Ajax 一塊罵了。
引用:沒有鏈接的web就像森林中迷路的羔羊,這句看似廣告語(yǔ),其實(shí)是web設(shè)計(jì)的根本原則。
這句“原則”至少我并不知道,因此看起來不過就是一句廣告語(yǔ)而已。我的原則是 Web 應(yīng)用首先需要對(duì)于最終用戶友好,然后才需要考慮對(duì)于搜索引擎友好。你使用 HTML FORM 提交的數(shù)據(jù)也是沒有鏈接的,這些數(shù)據(jù)可以被搜索引擎搜索到嗎?換句話說,可以添加在鏈接 URL 中的只有通過 GET 方法發(fā)送的請(qǐng)求。搜索引擎難道連使用 POST 方法提交的 FORM 數(shù)據(jù)都能搜索到嗎?如果搜索引擎能搜索到這些數(shù)據(jù),搜索引擎搜索到同樣通過 HTTP 協(xié)議以明文形式發(fā)送的 XML 數(shù)據(jù)難道是很困難的事情嗎?
必須要考慮對(duì)于搜索引擎友好的應(yīng)用也是有限的。你以為 Google 真的沒有辦法解決這些問題嗎?太小看 Google 了吧?
2、這個(gè)作者顯然很少做 JavaScirpt 開發(fā),以至于說出這樣沒有調(diào)查的話來:
引用:更可怕的是在javascript中竟然沒有一款順手的Debug軟件,很多寫js的老手到今天還是用最原始的alert("")來調(diào)試,splinetech JavaScript HTML Debugger 算是一個(gè)看起來還像個(gè)樣子的調(diào)試器吧,可惜不是免費(fèi)的,幾十大刀讓我這種窮人只能望而生嘆了。
M$ Visual InterDev、Office 2003 中帶的 Script Debugger 都是非常好用的調(diào)試工具。如果不愿意花錢買這些工具,還可以使用 Mozilla 開發(fā)的 Venkman,調(diào)試功能已經(jīng)非常完善了。說 JS 沒有很好的 IDE 是實(shí)情,說 JS 沒有很好的調(diào)試工具簡(jiǎn)直是天大的笑話。
3、
引用:和上面說的差不多,層層包含js文件是AJAX的通病,再加上以往的很多服務(wù)端代碼現(xiàn)在放到了客戶端,所以每次打開一個(gè)頁(yè)面會(huì)包含很多的無用的js文件也一同下載下來。雖然寬帶越來越普及,但是減少代碼冗余還是每個(gè)web設(shè)計(jì)者的必修課。
完全是沒有調(diào)查的胡說,如果通過不同的文件對(duì)于 JS 代碼進(jìn)行了認(rèn)真的組織,將 JS 函數(shù)分到很多小文件中,一個(gè)頁(yè)面僅僅只需要加載它自己使用到的 JS 文件,何來冗余代碼之說?
4、 引用:什么叫破壞web標(biāo)準(zhǔn)?點(diǎn)擊查看全部,這就是破壞了web標(biāo)準(zhǔn)。好好的A標(biāo)簽放著不用,偏要用span。這種例子很多,flickr中的標(biāo)題單擊后可以更改,這雖然(也包括我)是大家一致叫好覺得方便的設(shè)計(jì),但同時(shí)這也是歧義了 web元素本身的含義,物是人非這個(gè)詞不知道用的合不合適?
這僅僅是一個(gè)具體應(yīng)用中的用法,居然也歸到了 Ajax 頭上,真是欲加之罪,何患無詞。這里如果簡(jiǎn)單地將 span 換成 a 難道不是很容易的事情嗎?如果使用 a 就不能使用 onclick 了嗎?按照作者的想法,似乎所有的 a 都應(yīng)該只能是簡(jiǎn)單鏈接,不能加上 onclick,加上 onclick 就變成了 Ajax,就觸犯了天條,破壞了 Web 標(biāo)準(zhǔn)。況且給 span 加上一個(gè) onclick 居然就上綱上線到破壞 Web 標(biāo)準(zhǔn)的層次,我研究 Web 標(biāo)準(zhǔn)這么多年,也沒有看出究竟破壞了哪一款哪一條的 Web 標(biāo)準(zhǔn)。Web 標(biāo)準(zhǔn)中什么地方規(guī)定只允許使用 a,不允許使用 span 來實(shí)現(xiàn)了?況且在最新的 XHTML 1.2 標(biāo)準(zhǔn)中,a 已經(jīng)變成了一個(gè)不推薦使用的標(biāo)記。什么是 Web 標(biāo)準(zhǔn),什么是破壞 Web 標(biāo)準(zhǔn)?回去翻翻書吧。
5、
引用:瀏覽器和瀏覽器之間的差異一直都是web設(shè)計(jì)者心中永遠(yuǎn)的痛,支持的css不一樣,支持的客戶端腳本不一樣,有的竟然連客戶端腳本的用法都有不同。這讓程序員非?鄲,最明顯的就是調(diào)用xmlhttprequest了,req=(window.XMLHttpRequest)?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP");這段創(chuàng)建xmlhttp對(duì)象的代碼就是為了適應(yīng)IE和非IE兩天陣營(yíng)的瀏覽器的經(jīng)典例子。說是沒有back和沒有history的瀏覽器,這也是一個(gè)諷刺,主要是指在AJAX下點(diǎn)擊鏈接是不Redirect頁(yè)面,所以不存在后退和前進(jìn)了,同樣,沒有后退和前進(jìn)也就無存找瀏覽歷史紀(jì)錄了。back和history存在的根本就是url的改變,在AJAX下人們發(fā)現(xiàn)不改url也同樣能達(dá)到內(nèi)容改變這個(gè)酷酷的特點(diǎn),何樂而不為呢?
我提到過多次《網(wǎng)站重構(gòu)》,這本書要解決什么問題?femto 開始讀了嗎?曾經(jīng)產(chǎn)生過讀這本書的欲望嗎?
創(chuàng)建 XMLHTTP 對(duì)象的不同語(yǔ)法只是一個(gè)非常小的問題,這是在 XMLHTTP 沒有被完全標(biāo)準(zhǔn)化之前的暫時(shí)問題,F(xiàn)在基于 Web 標(biāo)準(zhǔn)做開發(fā),必須要寫針對(duì)不同瀏覽器的代碼片斷的場(chǎng)合已經(jīng)非常少了,封裝這些差異的 JS 庫(kù)網(wǎng)上也已經(jīng)有很多了。
無法利用 back/history 的問題在 Google Maps 中是使用 IFrame 來解決的,這個(gè)問題我在 BEA User Group 的演講中已經(jīng)說過了。
6
引用:xml有一個(gè)致命的缺點(diǎn),那就是加載的資源耗費(fèi),這好像是所有平臺(tái)下xml的通病。google map雖然是Jesse James Garrett推薦的AJAX的品牌代言人,但是gmap并沒有用xml,而是用了原生的javascript數(shù)組,我自己在用AJAX從服務(wù)端傳回?cái)?shù)據(jù)時(shí)也從來不用 XML,因?yàn)樗屛腋爆嵶屜到y(tǒng)更慢。服務(wù)端首先要調(diào)用xml對(duì)要傳輸?shù)臄?shù)據(jù)進(jìn)行封裝,客戶端得到數(shù)據(jù)后再調(diào)用xml進(jìn)行解析,簡(jiǎn)直是畫蛇添足。
致命嗎?我做了這么多瀏覽器端的 XML 開發(fā),為什么至今沒有感受到?Google Maps 服務(wù)器端傳給客戶端的數(shù)據(jù)就是不折不扣的 XML,其它的開發(fā)人員還可以對(duì)這個(gè) XML 進(jìn)行定制加入自己的數(shù)據(jù)。Google Maps 還在客戶端幾個(gè)功能上使用了 XSLT。說 Google Maps 沒有使用 XML,要不要我把我親自整理過的 Google Maps 客戶端的代碼發(fā)給你你才能閉嘴?
7、
引用:AJAX適用于什么?能干什么?能帶來什么?在網(wǎng)站上用AJAX那是笑話,除非像Google Map和Flickr這樣的專業(yè)領(lǐng)域的網(wǎng)站外,普通網(wǎng)站根本沒必要用這個(gè)技術(shù);在龐大的企業(yè)應(yīng)用市場(chǎng)估計(jì)還能有AJAX的一點(diǎn)容身之地,不過在MS、 SUN不會(huì)看著AJAX這個(gè)野孩子來在他們的地盤上撒潑的,如果大家都用AJAX,那java給誰(shuí)賣?.net給誰(shuí)賣?所以AJAX在企業(yè)應(yīng)用也不是長(zhǎng)久之地。所以,AJAX現(xiàn)在找不到自己合適的位置是個(gè)很大的尷尬。疑病亂投醫(yī),最近把AJAX的矛頭指向Flash和Applet就是一個(gè)例子。
又是一番奇談怪論。說大公司不會(huì)使用 Ajax 完全是主觀臆測(cè)。事實(shí)上,大量使用客戶端 JS 的大公司包括以下這些:
Macromedia:在 Dreamweaver 產(chǎn)品中包括了大量的 JS 代碼。
Oracle:很多產(chǎn)品都使用了 JS,目前對(duì)于 Ajax 很感興趣。這個(gè)消息是我在深圳 Oracle 做開發(fā)的一個(gè)朋友親口告訴我的。
SAP:早在很多年以前,SAP 就在其產(chǎn)品中大量使用了 JS+XMLHTTP 的技術(shù),僅僅是 SAP 沒有炒做這個(gè)概念而已。說 Ajax 不適合企業(yè)應(yīng)用,SAP 是靠做什么吃飯的?
Google:我已經(jīng)不需要再說什么了。