(本文選自《程序員》2007年第12期)
編者按:近兩年來,AJAX之風(fēng)愈演愈烈,其相關(guān)技術(shù)以及背后所秉承的理念正逐漸被越來越多的開發(fā)人員所認(rèn)可。隨之而來的AJAX開源框架 也層出不窮。更令人欣幸的是,在眾多框架之中,我們?nèi)A語開發(fā)者為Web應(yīng)用開發(fā)人員貢獻(xiàn)了兩個(gè)出類拔萃之作:新技術(shù)的“領(lǐng)頭羊”ZK,厚積薄發(fā)的“水牛”Buffalo。本期的工具欄目,邀請(qǐng)到ZK創(chuàng)始人——葉明憲和Buffalo創(chuàng)始人——陳金洲,對(duì)當(dāng)前一些流行的AJAX框架做出點(diǎn)評(píng),并且與讀者 分享AJAX框架的發(fā)展現(xiàn)狀及趨勢(shì)。
葉明憲觀點(diǎn)
AJAX 已流行二、三年了,現(xiàn)今所謂 Web 2.0 網(wǎng)站或多或少有 AJAX 影子。然而新的 AJAX 框架仍不斷誕生,現(xiàn)有的框架也在持續(xù)推出新的版本。為什么?
首先,AJAX應(yīng)用范圍持續(xù)擴(kuò)大,從 del.icio.us 簡(jiǎn)易的編輯功能,到 999fang.com 整合 AJAX 和數(shù)據(jù)庫搜尋,到 Google Spreadsheets 近似 Windows 應(yīng)用程序。再者,AJAX已緩步進(jìn)入企業(yè)應(yīng)用。除了User Friendly,安全、開發(fā)及維護(hù)成本、與現(xiàn)有應(yīng)用服務(wù)器、服務(wù)和開發(fā)環(huán)境的整合度等更是企業(yè)應(yīng)用的重點(diǎn)。這些都已跳脫早期框架的范疇。
目前 AJAX 在企業(yè)應(yīng)用正處于 Geoffrey Moore 所謂的Chasm中,預(yù)期接下二年會(huì)慢慢大量投入使用。而在消費(fèi)型網(wǎng)站的應(yīng)用正走過高成長(zhǎng)期,聚光燈的焦點(diǎn)將逐漸移到如Google Spreadsheets的應(yīng)用。
在這種背景之下,AJAX框架如雨后春筍,層出不窮。很多開發(fā)者朋可能都有自己的偏好,但是仍有一些開發(fā)人員面對(duì)這么多框架,可能會(huì)感覺無從下手。我們可以從多個(gè)面向來看這些框架。
從功能面來看,可分為以下幾類:
1、瀏覽器端的底層鏈接庫,如 Prototype, script.aculo.us, jQuery 等。
2、瀏覽器端UI組件庫,如 Ext-JS, Dojo 等。
3、整合式框架,如 ZK, Backbase, IceFaces 等。
其中,底層鏈接庫應(yīng)用最廣、輕巧易整合力但功能有限。整合式框架則包括瀏覽器端及服務(wù)器端的完整框架。
DWR和GWT則較難分類。DWR基本是JavaScript-to-Java 的 RPC框架,而GWT則是在RPC 加上瀏覽器端開發(fā)工具。
從應(yīng)用面來看,可粗分網(wǎng)站應(yīng)用和企業(yè)應(yīng)用。底層鏈接庫多用于網(wǎng)站應(yīng)用或當(dāng)其它框架的基礎(chǔ)。UI組件庫則二者都有,而整合式框架側(cè)重在企業(yè)應(yīng)用。
從系統(tǒng)架構(gòu)來看,可分Client-centric和Server-centric。所謂 Client-centric 是指你寫的程序代碼(UI部份)主要執(zhí)行的地方在客戶端 (即瀏覽器),而 Server-centric 則在服務(wù)器端。大部份框架多是 Client-centric,如Dojo, Prototype,GWT,Ext-JS,Backbase等。而Server-centric則以ZK為代表。
一般讀者不太注意架構(gòu)的差別,但它是決定開發(fā)及維護(hù)成本的關(guān)鍵。
讀到這里,可能仍有人心存疑問:到底哪種框架適合我的應(yīng)用?事實(shí)上,沒有單一個(gè)框架適合所有應(yīng)用。對(duì)于強(qiáng)調(diào)簡(jiǎn)易直覺接口的Web 2.0網(wǎng)站而言,通常只有幾個(gè)需要 AJAX化的功能,可藉由瀏覽器端的底層鏈接庫的幫助,并投入相當(dāng)資源,以使這些AJAX 化出眾奪目才是最重要的。對(duì)于現(xiàn)有Web應(yīng)用程序,如架構(gòu)于Struts、JSP或JSF等,則可依其對(duì)JavaScript熟悉度而選擇瀏覽器端UI組 件庫或整合式框架。使用瀏覽器端 UI組件庫,需要較多定制化JavaScript程序代碼才能整合到原應(yīng)用程序中。而使用整合式框架,則要視其是否支持現(xiàn)已使用的架構(gòu)。例如,若使用.NET平臺(tái),則只能使用 Microsoft的框架。若使用JSP則可使用ZK和Backbase。若使用JSF則可使用ZK,Backbase和IceFaces。
利用ZK框架設(shè)計(jì)的Web應(yīng)用程序具備豐富的胖客戶端特性和簡(jiǎn)單的設(shè)計(jì)模型。ZK包括一個(gè)基于AJAX可自動(dòng)進(jìn)行交互式操作的事件驅(qū)動(dòng)引擎和一套兼容 XUL (XML User-interface Language——基于XML的用戶接口語言)的組件。利用直觀的事件驅(qū)動(dòng)模型,你可以用具有XUL特性的組件來表示你的應(yīng)用程序并通過由用戶觸發(fā)的監(jiān)聽事件來操作這些組件。目前,ZK 3.0 版本已發(fā)布。提供了基于XUL和XHTML現(xiàn)成豐富的組件:網(wǎng)格、標(biāo)簽頁裝飾器、樹形目錄、組合框、圖表、滾動(dòng)條、分割條、音頻等等。此外,還提供了宏組 件,能夠開發(fā)新組件像搭積木一樣簡(jiǎn)單和方便。編寫腳本(Script)功能可以用EL expressions和你偏好的腳本語言,包含但不僅限于Java、JavaScript、Ruby、Groovy和MVEL的語言。值得一提的是,最 新版本還集成了Google Maps, FCKeditor, Dojo以及 Timeline,并且提供對(duì)Google最新發(fā)布的手機(jī)操作平臺(tái)Android的開發(fā)支持。
有人預(yù)測(cè),Silverlight、 Flex等RIA框架的出現(xiàn),將對(duì)AJAX框架構(gòu)成嚴(yán)重威脅,我的看法剛好相反。Silverlight、Flex等是大型軟件公司企圖以私有 protocol 壟斷新興市場(chǎng)的老方法。然而因特網(wǎng)的巨大并不是任何人所能控制的。感謝Tim Berners-Lee等人無私的貢獻(xiàn),因特網(wǎng)已成為最公平最開放的平臺(tái)了。事實(shí)上 Flex 不久前才剛轉(zhuǎn)為Open Source,這對(duì)定價(jià)超過一萬美元的軟件,算是個(gè)重大的挫敗。
陳金洲觀點(diǎn)
AJAX框架的選擇
由于現(xiàn)在很少有人只用一種AJAX技術(shù),我將AJAX框架的范圍擴(kuò)大一些,分為偏重展現(xiàn)、偏重傳輸、工具型三個(gè)部分。由于我自己的Web工作語言主要在 Java, Ruby以及Python之間,以下的評(píng)價(jià)不包含PHP, .NET下的一些工具。另外,對(duì)自己開發(fā)的和它的主要競(jìng)爭(zhēng)者DWR有主要的比較,其他的僅作泛泛評(píng)述,估妄言之。
偏重展現(xiàn):YUI, Qooxdoo, Dojo
·YUI :目前設(shè)計(jì)比較完整,美觀,全面的界面工具庫。
·Qooxdoo: 開源的另一種選擇。
·Dojo: 比較完善的庫結(jié)構(gòu),豐富的界面控件。
偏重傳輸:Buffalo, DWR
Buffalo特性:
1、基于prototype。如果你的AJAX應(yīng)用也是基于prototype,那么可以減少重復(fù)加載prototype的帶寬,并且獲得相當(dāng)一致的編程概念。
2、Bind: 提供了對(duì)結(jié)果數(shù)據(jù)的處理,直接將數(shù)據(jù)綁定到頁面對(duì)象并展示,這是一個(gè)動(dòng)人的特性。在2.0中,Bind能力更加強(qiáng)大,能夠?qū)⒅抵苯咏壎ǖ奖韱卧?、表格?DIV/Span、甚至整個(gè)表單上。關(guān)鍵是這種綁定是無侵入并且與buffalo整體結(jié)構(gòu)完全整合,對(duì)外表現(xiàn)只有一個(gè)簡(jiǎn)單的 {{buffalo.bindReply}}或者{{Buffalo.Bind.bind}}即可。
3、序列化:Buffalo支持任意對(duì)象,任意深度,任意數(shù)據(jù)結(jié)構(gòu)的Java到JavaScript以及JavaScript到Java的雙向序列化,并且支持引用。
4、生命周期對(duì)象訪問:1.2.4之前需要繼承一個(gè)BuffaloService,從1.2.4開始就不需要繼承了,引入了線程安全的 BuffaloContext對(duì)象,只需要通過BuffaloContext.getContext()即可獲得一個(gè)線程安全的引用,并且對(duì) Request的各種屬性進(jìn)行操作。
5、對(duì)Collection/Array的模糊處理:Buffalo中提供了對(duì)Collection/Array對(duì)象的模糊識(shí)別能力。例如:服務(wù)器端有一個(gè)方法需要List參數(shù),客戶端傳遞過去一個(gè)javascript數(shù)組就可以了,不需要費(fèi)心的組裝對(duì)象。
6、客戶端組裝對(duì)象:Buffalo支持在客戶端組裝對(duì)象,甚至可以直接將整個(gè)表單序列化為一個(gè)對(duì)象作為參數(shù)傳給遠(yuǎn)程客戶端。
7、對(duì)重載方法的處理能力:由于Java與JavaScript之間類型的不匹配,DWR的代碼生成無法對(duì)重載方法進(jìn)行處理。例如,sum(double,double), sum(int, int) DWR很可能不知道你要調(diào)用哪一個(gè)。從2.0開始Buffalo支持了對(duì)重載的處理。
DWR特性:
1、支持Batch,可以將多個(gè)Service函數(shù)調(diào)用放在一個(gè)XMLHttpRequest請(qǐng)求中完成。
2、Converter:可以轉(zhuǎn)換任意類型的Java對(duì)象到JavaScript,并允許直接使用。例如:Customer類包含一個(gè)address變 量,當(dāng)AjaxCall返回Customer對(duì)象的時(shí)候,可以直接在Javascript中使用customer.address來獲得Address的 信息。
3、允許Expose部分函數(shù)和屬性。(Buffalo無限制,可以訪問Service中的任意函數(shù)。)
4、DWR2.0中提出了Reverse Ajax,提供在Java代碼中來處理頁面上元素的功能。
工具型:Prototype, JQuery, Dojo
·Prototype:得益于Ruby語言的設(shè)計(jì),它使得你能夠以幾乎類似于編寫Ruby的方式編寫JavaScript。由于綁定在Ruby On Rails的發(fā)行包中,它成為近兩年最流行的AJAX工具。早期它小巧靈活,現(xiàn)在由于加入太多的特性,日漸臃腫。目前1.6版本大小已經(jīng)超過120K。
·JQuery:Prototype的主要競(jìng)爭(zhēng)者。簡(jiǎn)單是它最大的優(yōu)點(diǎn)。大多數(shù)常見的復(fù)雜操作、效果,JQuery的代碼量能夠比Prototype少50%以上。
·Dojo:采用類似于Java包的管理方式,實(shí)現(xiàn)按需加載JS。提供了全面的AJAX、DOM操作支持。然而需要在HTML TAG中嵌入額外的屬性,使得網(wǎng)頁不能遵守W3C標(biāo)準(zhǔn),不少開發(fā)者對(duì)此耿耿于懷。
來自RIA框架的沖擊?
我并不贊同這種說法,恰恰相反,我認(rèn)為像Silverlight,F(xiàn)lex等這些RIA框架要考慮來自Web應(yīng)用的沖擊。Web領(lǐng)域幾乎已經(jīng)不存在技術(shù) 壁壘,能做哪些,那些不適合,負(fù)載均衡等等已經(jīng)有充分的資源可以參考。各種模式都可以靈活的應(yīng)用到其中,各種測(cè)試工具(如Selenium網(wǎng)頁測(cè)試工 具)、開發(fā)工具支持得非常出色。而RIA框架要考慮的問題遠(yuǎn)遠(yuǎn)要比現(xiàn)在的Web應(yīng)用多得多。除了RIA所承諾的更容易的實(shí)現(xiàn)華麗的效果──在多種JS庫的 支持下這些效果在Web下并非難事──他們有更多的問題需要考慮:資源的獲取和釋放,測(cè)試的支持,本地存儲(chǔ)的問題,事件機(jī)制,狀態(tài)的同步,客戶機(jī)、服務(wù)器 數(shù)據(jù)交互機(jī)制(序列化反序列化)等等。RIA想如同現(xiàn)在的Web應(yīng)用般大規(guī)模,遠(yuǎn)不到時(shí)候。大多數(shù)基于RIA應(yīng)用的考慮是讓應(yīng)用能夠離線運(yùn)行,然而與此同 時(shí)瀏覽器也在發(fā)展,基于網(wǎng)頁的本地存貯已經(jīng)在Google Reader中可以實(shí)際使用。也許某一天瀏覽器就是一個(gè)完美的RIA平臺(tái),Web應(yīng)用只需添加本地存貯支持就可以離線使用──類似于Flex、 Silverlight的RIA技術(shù),與Web應(yīng)用,哪個(gè)更容易被接受,還真難見分曉。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。