原文:http://www.alistapart.com/articles/fromswitchestotargets
作者:Eric Meyer
當我讀了一遍Aaron Gustafson的Beyond DOCTYPE: Web Standards, Forward Compatibility, and IE8 後,我心裡的第一反應就是深深的否定這種觀點. Aaron描述的version-targeting機制是完全錯誤的, 是完全倒退的, 是和我們應該做的事情完全相反的. 在web開發領域浸淫了十多年的我的每條神經都在反對.
為什麼我會如此的抗拒? 部分原因是目標轉換器像是"浏覽器嗅探"技術的復仇. 真的, 在眾多浏覽器正確的支持標准前, 嗅探器是應付它們之間不兼容情況的必需的方法, 但是到最後它都沒有起到作用. 在你上傳你的腳本之後沒多久, 一個浏覽器的新版本就出現了, 並且又破壞了它. 浏覽器嗅探技術脆弱的,弄巧成拙的本性是將標准帶給我們的浏覽器的理想背後的反抗力量. 如果從浏覽器的代碼層把它合法化, 那他又將成為一種破壞標准之路的力量了.
首先, 我為目標轉換器感到煩擾, 因為它這樣做和向前兼容的發展背道而馳. 這曾經是我們的行業多年來的最優方法, 是在浏覽器戰爭中艱難的發現的生存方式. 我們著眼於未來的開發, 大部分使用普及的穩定的功能來實現, 然後使用一些不影響我們網站正常使用的 "尖端技術" - 這逐漸就成為了 "逐步加強". 這種方法的一個例子是在"Go To Print"中描述過的技術, 這種技術可以讓進步的浏覽器在需要打印的頁面上顯示出鏈接的URL,但是又不會破壞不具備這項功能的浏覽器的打印的效果.
對於目標轉換器而言,什麼為未來作出規劃, 什麼前瞻性, 都幾乎被摧毀殆盡了. 浏覽器會承諾總是向後兼容. 對於浏覽器來說目標轉換器就像是個時間機器, 它的想法是當用IE 10來裝載IE 7的頁面時, IE 10要讓自己像IE 7一樣的工作, 不管在這些年裡發生過什麼.
從而, 作為一個開發者, 沒有必要追求超現實狀態的浏覽器. 我甚至可以假設, 浏覽器們始終會支持我做的東西, 甚至是那些目光短淺的, 特定浏覽器的, 無論如何都需要標准的. 至於浏覽器預期將支持的方向: CSS或者JavaScript又或是Html5...誰又在意呢?
那麼, 誰在意呢? A List Apart 的讀者們, 的確, 以及我們中的大部分. 但是在調查分析後顯示, 大多數的網頁內容都沒有很重視基於標准,向前兼容的原則.
是的, 我們已經取得了長足的發展. 對開發者進行的教育也結出了一些果實. 盡管如此, 我們必須正確的對待這些. 我們沒有(標准)到達所有的人, 或許永遠都不會. 一些網站是根據當前浏覽器能做什麼進行開發的, 而從不管對照規范是否錯誤, 或者其他浏覽器中的行為是否正確.
這讓浏覽器廠商在面對他們的缺陷時處於一個進退兩難的境地: 修正它或是保留它? 最經典的一個例子是 "Internet Explorer的原始width和height" , 這是對CSS規范的錯誤執行. IE 團隊在發布IE 3後不久就意識到這個問題了...但是一直到了IE 6才真正修復, 這樣的延誤減慢了CSS的應用, 並引發了所有的JavaScript嗅探和CSS Hacks.
Doctype的轉換確實拯救了它們, 允許IE 6在"quirks mode"保留舊的(錯誤的)行為, 在"standards mode"下進行正確的解析 - Mac版本的IE5引進的一個機制, 也很快被其他浏覽器采用了.
讓我們想一想, 通過Doctype的轉換, 浏覽器有效的認可了兩種狀態: 老的和正確的. 這是在Doctype轉換出現之前的日子裡的一種最新的,最偉大的方法.
我們已經有了一個版本目標的例子(Doctype轉換). 當我用這種方法實現了, 我卻陷入了混亂. 畢竟, 我是Doctype轉換的推行者, 並且現在還在依賴它進行工作. 我應該憎恨這整個想法嗎, 或者不?
就像在2000年的Doctype轉換, 版本目標否定廠商的說法,怕破壞了現有的網站,現有的行為是不能改變的. 如果IE 8能夠修正它對一些CSS屬性或DOM方法的實現的話, 那在IE 9中的錯誤我們就可以在站點不被破壞的基礎上修正了.
而且, 如果這一切就像標榜的那樣, 那最終會讓web開發更少的依賴於虛擬計算機. 如果你需要支持當前的浏覽器,又要顧及之前版本的, 你只需要更改你的X-UA-Compatible值到一個較早的版本然後看看事情變得怎麼樣了 - 不需要VirtualPC的副本. 這不會立刻發生, 但是這是合理的最終結局.
我們超越了浏覽器嗅探, 不是嗎? 沒有人把這稱為 "脆弱" 與 "弄巧成拙"?
我們知道的浏覽器嗅探技術和版本目標器之間有至關重要的差別. 首先, "浏覽器嗅探技術" 在現在意味著 "編寫代碼檢查正在用什麼浏覽器, 然後對標簽/CSS/JS/服務器端響應/任何東西進行相應的調整." 版本目標器完全相反, 它讓 "浏覽器自己檢查頁面是什麼時候開發的, 並做出相應的調整." 換句話說, 版本目標把web開發者從嗅探中解放出來, 並把這個責任交給浏覽器開發商.
這不是個能輕松討論的改變. 浏覽器的實現者們常用資源有限的借口來回絕我們, 但是卻依然指揮著比我們之中的任何人能召集的還要多的資源和技術進行回退測試. 而且, 浏覽器開發商對確保版本目標像承諾的那樣不破壞舊站點比網站作者更新舊站點以支持新浏覽器具有更大的既得利益.
浏覽器嗅探技術和版本目標器之間的第二個區別是浏覽器嗅探技術是向未來看, 而版本目標器是向過去看. 向未來看是浏覽器嗅探之所以脆弱的主要原因之一: 很難去預知未來. 舉例來說: Safari在用戶端的標識符中包含了"like Gecko"讓很大一群嗅探腳本出錯了 - 甚至是那些做得比較好的. 這些腳本的作者因為不能預知一個Apple的non-Gecko的浏覽器會在用戶端標識符中包含"Gecko"這個詞而完全失敗了.
現在, 我們的前景是浏覽器自身會做浏覽器嗅探了, 然後會向後看了, 這會有更多的穩定性: 過去的總是比預知未來更容易掌握.
此外, 我們已經為浏覽器們寫了足夠的腳本和Hacks來適應他們, 是不是該是浏覽器開始來適應我們的頁面的時候了?
我們知道向前兼容的研究工作. 更多的是, 雖然關於它的一切我們都知道了. 在互聯網初始的時候, 除Doctype轉換以外, 浏覽器一直是以"所見即所得"為目標的. 開發者們在推測未來的浏覽器要做什麼的同時還要被迫保持和過去的浏覽器一樣的行為.
向前兼容的發展以及它的親戚: 逐步加強是適合的,必須的, 因為這是我們的網站能在未來正常工作的唯一希望. 對向前兼容的歌頌在我們工作的世界中是必需的.
在另一個浏覽器開始采用版本目標的世界裡, 可能就是另一種選擇了. 誰會知道會發生什麼? 可能我們會發現向前兼容變得非常脆弱, 甚至相當可笑.
我們說向前兼容的發展是衡量一個專家的的標志, 因為我們的直接決定了這樣. 版本目標的出現, 那種要求可能就會完全消失了, 呈現出來的不再出錯,但是變得毫無意義. 雖然我根深蒂固的本能仍在抵抗這種結論, 但是我不得不進我最大的努力去看這個可能會發生的未來, 然後問自己, 這會不會比我們知道更好或是更壞?
這看起來更好.
在最後, 讓我非常震驚的, 我原來並不討厭這個想法. 版本目標使浏覽器更容易開發新的功能, 並且在原有功能上修復錯誤和缺點, 這會潛在的加速web設計和發展, 單單這一個理由就就足夠給它一個機會了.
當然, 我還是有所顧慮.
最大的顧慮是保真度. 會不會IE 8的向後兼容代碼工作起來看起來還是像IE 8一樣, 或者會不會有細微的改變但是還是破壞了舊的網站? 可能會這樣, 但是我們不敢說, 新的缺陷會影響未來浏覽器的向後兼容嗎? 畢竟, 門會向兩邊擺: 廠商可能會讓他們的"向後看"代碼不是很嚴密, 就像開發者可能會讓他們的 "向前看" 代碼不是很嚴密一樣. 諷刺一下.
另一個小小的顧慮是版本目標代碼在浏覽器程序上的大小問題. 這會讓浏覽器變成一個臃腫的程序嗎? 一些人會認為 "誰在意啊? 現在的硬盤都很大了!" 但是我仍舊堅定的不同意"資源廉價"的觀點. 不管它們如何的廉價, 那也都是人們努力出來的. 我真誠的希望未來的浏覽器不會需要1或2G的存儲空間, 它的歷代版本Jacob Marley他過去的行為一樣.
我完全不是 "edge" 這個詞的崇拜者. 原因是, 它的存在似乎使每個人都用自己的方法使用鎖定機制, 比如 "IE=1024"或是其他更大的數字. 問題在於提供一個關鍵詞當量創建一個官方賦予的氛圍的事情, 我不認為microsoft會提供. 讓所有人都使用這個機制是他們的利益所在, 這個關鍵字在希望取消它的人們面前充當著一個眼色,一個點頭. 我完全贊同人們遵守這個鎖定機制,如果他們希望的話 - 我能更好地完成這個工作, 但是這需要用到hacks, 而並不是官方的關鍵字.
Doctype作為版本目標
我想我會感到高興, 如果頁面在不使用任何版本目標信息也能被處理的話. 如果一個頁面不包含任何版本目標信息, 那麼Doctype就會充當版本目標的代理人. 比如說, 所有的HTML 4和XHTML 1的Doctype會在IE 7中作為默認鎖定值. 在未來, Html 5的Doctype會作為IE 9或IE 10的默認鎖定值, 這取決於被打開的文件.
當然, 開發者可以提供一個明確的浏覽器版本來忽略所有的: 一個 HTML 2的文檔可以被IE9鎖定, 一個Html 6的文檔可以被IE 7鎖定. 但是在沒有明確的版本目標信息時, Doctype要作為替身來連接到一個特定的版本. Microsoft的觀點, 這是必需的: 如果沒有這種方式, 沒有目標的頁面會被新版本的IE破壞. 我了解這點. 但是這意味著為了能像他們本來的樣子那樣處理頁面, 隨著浏覽器的進步, 你就必須為目標機制作Hacks: 用一個很大的版本號數字 - 或者用edge關鍵字, 如果它沒有被剔除的話.
最大的挑戰, 似乎是, 他們必須確保版本目標在未來的浏覽器中以這樣的方式運作而要像Doctype轉換那樣的不會破壞網站功能. 換句話說, 我們還要確保它的向前兼容.
我想我的那些本能最後又出現在身邊了.