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