將Web視為應(yīng)用平臺(tái)的概念,正前所未有的流行著。但用來創(chuàng)建這些所謂“Web應(yīng)用”的工具仍存在許多經(jīng)常被我們忽視或誤解的陷阱。單頁面Web應(yīng)用框架已得到極大關(guān)注,我們可以借助這些框架創(chuàng)建一些復(fù)雜的高性能應(yīng)用,與傳統(tǒng)網(wǎng)站相比,這些應(yīng)用更可靠且交互更加豐富。但所有的這些益處,以及隨之而來 的思維模式和開發(fā)方式的轉(zhuǎn)變,是以犧牲瀏覽器的基本功能為代價(jià)的,Web開發(fā)者們有時(shí)卻將其視為理所當(dāng)然。
JavaScript可能非常脆弱
隨 著各家廠商不斷地炒作這股熱浪,我們可能誤以為當(dāng)用戶的瀏覽器不能執(zhí)行JavaScript時(shí),并不需要為他們提供回退方案。用戶的瀏覽器不能執(zhí)行 JavaScript一定事出有因,他們手動(dòng)選擇禁用JavaScript只是眾多原因之一。維護(hù)英國政府網(wǎng)站的團(tuán)隊(duì)——政府?dāng)?shù)字服務(wù)(GDS)發(fā)現(xiàn):每 500位訪問GOV.UK的用戶中,有5人沒有請求JavaScript,其中只有1人主動(dòng)禁用了JavaScript,其他4人沒有請求可能因?yàn)橐韵聨?個(gè)原因:企業(yè)代理服務(wù)器限制過高;高延遲導(dǎo)致JavaScript請求超時(shí);甚或是一個(gè)沒有被注意到的語法錯(cuò)誤。
此外,CSS和HTML都 可以優(yōu)雅降級(jí),而JavaScript卻做不到。這意味著,如果開發(fā)者使用一個(gè)單一的ES6語法特性,甚或是調(diào)用一個(gè)沒有經(jīng)過驗(yàn)證的標(biāo)準(zhǔn)庫函數(shù),他們的 JavaScript就很有可能在執(zhí)行過程中終斷或者根本就不執(zhí)行。如果你使用JavaScript來增強(qiáng)網(wǎng)站,上面提到的這些問題尚且可以忍受,畢竟訪 問者仍然可以訪問鏈接,可以提交表單,可以使用Web能提供的最原始功能;但如果JavaScript是網(wǎng)站必不可少的一部分時(shí),無論是誰使用稍微過時(shí)的 瀏覽器都可能獲得一個(gè)空白頁面,自然也沒有人來解釋頁面為什么會(huì)變成空白。
語義結(jié)構(gòu)仍然非常重要
自1993年Tim Berners-Lee設(shè)計(jì)HTML以來,HTML為相互關(guān)聯(lián)的文檔網(wǎng)定義了一個(gè)通用結(jié)構(gòu),也就是我們熟知的Web。滲透在這個(gè)通用結(jié)構(gòu)中的語義含義為 Web頁面中包含的信息提供了計(jì)算機(jī)可以處理的上下文。從實(shí)際的意義來說,這些額外的信息增強(qiáng)了用戶使用Web瀏覽器時(shí)的體驗(yàn)。舉個(gè)例子,Web瀏覽器可 以實(shí)現(xiàn)一個(gè)向用戶的日歷中添加使用time元素定義的事件的方法;屏幕閱讀器可以用不同的方式通讀一個(gè)列表或一段文字,對(duì)于人類來說,文檔中的列表與段落 看起來明顯不一樣,HTML提供的通用框架讓計(jì)算機(jī)也能夠清晰分辨列表與段落。
HTML暗含的語義含義使Web與諸如Cocoa、WPF以 及Qt這樣的原生應(yīng)用環(huán)境有著不同的發(fā)展方向。結(jié)構(gòu)化的信息對(duì)Web來說非常重要,因?yàn)槲覀冃枰ㄟ^多種方式訪問Web信息。而當(dāng)我創(chuàng)建一個(gè)iPhone 應(yīng)用時(shí),我可以穩(wěn)妥地假設(shè)每一個(gè)人都會(huì)用相同的方式去使用它。我的App總會(huì)以相同的方式呈現(xiàn)信息,并且我能夠完全掌控信息在應(yīng)用里的最終呈現(xiàn)。即使有些 人通過VoiceOver(Apple為視障人群提供的輔助技術(shù))與我的App進(jìn)行交互,他們?nèi)匀豢梢耘c視力正常的用戶一樣:通過點(diǎn)擊屏幕進(jìn)行操作。唯一 的不同是他們需要聽文字而不是去閱讀。
而這種方法在Web上卻行不通。人們除了通過Web瀏覽器訪問網(wǎng)站,還會(huì)通過類似Pocket、 Instapaper這樣的應(yīng)用來消費(fèi)網(wǎng)站內(nèi)容,這些應(yīng)用嘗試使用Web頁面的結(jié)構(gòu)化信息來提取網(wǎng)站的相關(guān)內(nèi)容。智能手表上的瀏覽器可能直接忽略你的布 局,然后通過更適合一英寸屏幕的方式展現(xiàn)你的信息。未來的設(shè)備也許能夠直接將網(wǎng)站提供的信息轉(zhuǎn)化為人類大腦中的思維,這誰又會(huì)知道呢?回過頭 看,VoiceOver的工作原理是按順序朗讀用戶指尖下排列的文字,然而Web屏幕閱讀器則通讀全部文檔,忽略布局,并且通過HTML標(biāo)簽的標(biāo)準(zhǔn)化語義 來推斷文檔含義。舉個(gè)例子,最近推出的main元素(譯者注:參考https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/main) 用來定義文檔的主體部分,Web屏幕閱讀器可以讀取并識(shí)別這樣的標(biāo)簽。對(duì)于一個(gè)視覺正常的用戶來說,通過Google Chrome訪問你的網(wǎng)站時(shí),無論你使用<main>或者是<div id=”main”>基本沒有區(qū)別。但對(duì)于使用其它Web客戶端的人來說,例如使用屏幕閱讀器或Instapaper,main元素隱含的含義可以 讓軟件更好地幫助他們?yōu)g覽文檔。
所以,開發(fā)一款Web應(yīng)用不像為原生平臺(tái)開發(fā)那么簡單。在五個(gè)主流瀏覽器中確保應(yīng)用能按照我們的需求正常工 作并及時(shí)發(fā)布,對(duì)于Web平臺(tái)來說還遠(yuǎn)遠(yuǎn)不夠,我們需要在屏幕閱讀器中測試我們的工作成果,需要重審我們的標(biāo)記來確保應(yīng)用能提供盡可能多的語義元數(shù)據(jù)—— 不僅需要協(xié)調(diào)已有的Web客戶端,也要為將來可能出現(xiàn)的一切設(shè)備做準(zhǔn)備。
目前,開發(fā)者使用單頁面Web應(yīng)用框架需要針對(duì)加載JavaScript作出一個(gè)權(quán)衡。但在我看來,這些正是框架應(yīng)該去解決的問題。作為Web開發(fā) 者,我們有幸使用有史以來最通用的編程語言之一為Web編寫應(yīng)用代碼。如果框架開發(fā)者能夠夜以繼日(不可否認(rèn)任務(wù)非常艱辛)地使應(yīng)用像在瀏覽器中一樣地運(yùn) 行在Node中,服務(wù)器就可以完成初始頁面渲染的任務(wù),隨后所有的任務(wù)由瀏覽器負(fù)責(zé)處理。當(dāng)然,如果服務(wù)器可以將鏈接渲染成a標(biāo)簽的形式,就像Ember 目前在客戶端上實(shí)現(xiàn)的那樣,那么就可以允許沒有收到JavaScript的用戶(無論出于什么樣的原因)正常瀏覽網(wǎng)站。同樣也可以通過在服務(wù)器(而不是在 客戶端)上運(yùn)行所有的驗(yàn)證和子任務(wù)邏輯,使表單正常工作。如果框架維護(hù)者一開始就朝著這個(gè)方向努力,那么每一個(gè)使用該框架的開發(fā)者都可以立即將一個(gè)只能工 作在最新Web瀏覽器中的應(yīng)用轉(zhuǎn)換為一種漸進(jìn)增強(qiáng)的體驗(yàn),這樣做幾乎可以兼容任何Web客戶端——過去的、現(xiàn)在的、以及未來的。
漸進(jìn)增強(qiáng)對(duì) 于Web開發(fā)者來說早已是重要的一環(huán),它使我們意識(shí)到對(duì)于Web體驗(yàn)來說內(nèi)容是至關(guān)重要的一部分,任何針對(duì)用戶體驗(yàn)的額外改進(jìn)不應(yīng)當(dāng)破壞任何一個(gè)客戶端訪 問Web頁面所包含的內(nèi)容。目前創(chuàng)建單頁面應(yīng)用的方法傾向于放棄這條準(zhǔn)則,然而漸進(jìn)增強(qiáng)和單頁面應(yīng)用從本質(zhì)上來講其實(shí)可以相互兼容。
事實(shí) 上,這個(gè)領(lǐng)域已經(jīng)有了不小的進(jìn)步,例如,一個(gè)Ember內(nèi)部的團(tuán)隊(duì)正在通過實(shí)現(xiàn)服務(wù)端渲染來改進(jìn)Ember與搜索引擎的兼容性。但是由單頁面Web應(yīng)用引 發(fā)的問題的解決方案并不能只依賴純技術(shù)角度:人們看待Web的方式已成為一個(gè)日益嚴(yán)重的問題。將Web視為另一個(gè)應(yīng)用平臺(tái)的做法已司空見慣,但是Web所 能做的比這多得多。無論訪問者通過2000美元的iMac還是50美元的安卓平板,甚至在我們無法想象的未來,花費(fèi)5美元就可以購買的Web客戶端來訪 問,Web始終是一個(gè)通用信息平臺(tái)。事實(shí)上,不犧牲小部分用戶的體驗(yàn)對(duì)我們來說非常重要,如此一來我們可以在這個(gè)過程中稍微改進(jìn)一下其余正在破壞Web普 適性的體驗(yàn)。
作者:Ross Penman是一位來自蘇格蘭的web開發(fā)者和狂熱的技術(shù)專家。2014年度新型人才網(wǎng)絡(luò)獎(jiǎng)決賽入圍選手。Ross經(jīng)常慶祝他的工作來促進(jìn)科技領(lǐng)域的年輕人。他的Twitter內(nèi)容與web開發(fā)和口袋怪獸訓(xùn)練有關(guān)。