(譯)html,xhtml,html5歷史演變
翻譯自:http://www.thymeleaf.org/doc/articles/fromhtmltohtmlviahtml.html
從HTML到HTML (通過HTML)
當您使用Thymeleaf等軟件時,了解HTML系列Web標準的內部非常重要。 至少如果你想了解你在做什麽。
問題是許多人都知道他們用於創建網絡的技術,但並不真正知道這些技術的來源。 自第一個Web界面開始以來,它已經走了很長的路,從那以後,每一項新技術都通過棄用我們的大量工作,尤其是我們的知識,來改變我們的Web開發方式。
現在,隨著HTML5的到來,事情變得更加復雜。它是什麽? 為什麽HTML代替XHTML? HTML標簽湯不是被認為有害嗎?
讓我們倒退一步,看看我們如何到達現在的位置,以及如何到達的。
1回到90年代,這裏是HTML…
…HTML是一個標準(更正確的說,是一個推薦) 由萬維網聯盟(World Wide Web Consortium,W3C)維護。從一種名為SGML的語言擴展而來,HTML定義了一種基於標記的語言,用於編寫超文本文檔,而超文本文檔耦合於超文本傳輸協議(Hyper-Text Transfer Protocol,HTTP,用於服務超文本文檔及其相關資源通過網絡傳輸)。
HTTP使用文本頭(headers)來定義向客戶端提供的服務以及如何服務,其中一個非常重要: 內容類型(Content-Type)頭。 這個頭向瀏覽器解釋了服務提供哪種類型的內容,使用一種稱為多用途Internet郵件擴展(Multipurpose Internet Mail Extensions,MIME)的語言。HTML文檔服務的MIME類型是text/html:
Content-Type: text/html
HTML還定義了一種檢查文檔是否有效(valid)的方法。有效基本意味著文檔是根據HTML規則編寫的,規則規定了標簽可以具有那些屬性,標簽可以出現在文檔的哪些位置,等等。
這些有效性規則是使用一種語言來指定的:用於定義SGML文檔結構的文檔類型定義(Document Type Definition,簡稱DTD)。每個版本的HTML都創建了一個標準DTD,並且HTML文檔都必須聲明DTD(指定了HTML版本),通過一個需要出現在首行的子句來確認, 即文檔類型聲明(Document Type Declaration,簡稱DOCTYPE)子句:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
2文檔對象模型和標簽湯(tag soup)
HTML用於在瀏覽器中顯示文檔,而在90年代後期,瀏覽器是由競爭激烈的廠商開發,這些廠商希望為用戶提供最多的酷炫功能。鑒於HTML僅定義了文檔格式的規則,許多其他功能留給了瀏覽器開發人員的想象力。
瀏覽器中出現的最有趣的想法之一是客戶端交互性(client-side interactivity)。這種交互性是通過執行瀏覽器內部的腳本實現 – 基於某種語言編寫如JavaCript,提供腳本對文檔的部分進行處理、修改甚至執行事件的能力。為此,瀏覽器必須將HTML文檔建模為對象的內存樹,每個對象都有狀態和事件,因此文檔對象模型(Document Object Model,簡稱DOM)誕生了。
問題在於,良好格式的HTML規則非常松散,而DOM樹是嚴格的層次結構,這意味著HTML標記位置和序列的不同解釋可能導致不同瀏覽器中的不同DOM對象樹。除此之外,這些不同的瀏覽器以不同的方式(不同的名稱,事件等)為DOM節點的API建模,您現在了解當時創建跨瀏覽器交互的難度了。
更重要的是:雖然所有這些都發生了,但是瀏覽器對於HTML開發者來說已經變得非常寬容,允許他們來編寫格式不正確的HTML文檔(標記湯),這通過自動糾正錯誤實現。這導致HTML開發者創建更糟糕格式的文檔,然後瀏覽器允許更多的格式錯誤,惡性循環。然後可以猜到:每個瀏覽器都以不同的方式糾正所有這些錯誤。太糟糕了。
W3C最終標準化了DOM API和Web瀏覽器中的腳本語言:JavaScript(盡管出於某些復雜的原因,他們堅持稱其為ECMAScript)。 但是,標簽湯的世界所造成的損害加上瀏覽器制造商完全緩慢的采用這些標準,因為在許多情況下擔心它們會損害向後兼容性,產生的影響仍然影響著我們今天創建Web應用的方式。
3進入XML
在HTML成為廣泛傳播的語言之後的一段時間,W3C開發了一種名為XML(eXtensible Markup Language,可擴展標記語言)的新規範, 旨在以分層標記文本的形式表示通用數據(不僅僅是Web)。
XML是可擴展的,因為它允許定義特定於目的的語言(標記及其屬性)以滿足特定場景的需要。但從XML視角來看,HTML文檔並非格式良好的,XML與HTML實際上仍然是不兼容的語言。無法將HTML表示為XML應用。
由於嚴格分層並消除了HTML的結構模糊性,XML文檔可以更直接地轉換為標準化的DOM樹(稱為XML解析的過程)。 另外,鑒於XML是一種基於文本的語言,並且該文本是一種與技術無關的格式(與二進制相反),XML特別適合跨互聯網的跨平臺數據交換。事實上,它導致了現在無處不在的Web Services技術的誕生。
4HTML + XML = XHTML
在某些時候,由於XML的明顯有用性以及它可以使Web文檔更具可擴展性和可互操作性(例如,在瀏覽器中生成更多可預測的DOM)這一事實,W3C決定將HTML重新表述為XML方言(或應用)而不是SGML,因此XHTML誕生了。
XHTML的引入以及將Web文檔轉換為格式良好的XML通常被視為向前邁進了一步,因為它允許跨瀏覽器的更高級別的標準化,更少的創作錯誤(必須以特定於瀏覽器的方式進行糾正)空間,以及更容易解析和自動處理網頁。
作為其中的一部分,XHTML引入了一個直接來自XML的有爭議的概念,稱為嚴格錯誤處理(Draconian Error Handling),這意味著任何XML解釋器(包括現在的瀏覽器)如果在正在處理的XML文檔中發現任何類型的格式錯誤都應該立即失敗。在實踐中,這意味著XHTML開發者必須創建格式完美的文檔,或接受瀏覽器永遠不能(事實上允許)顯示它們的事實。
為了驗證,XHTML 1.0規範定義了一組可以在DOCTYPE子句中使用的DTD:XHTML 1.0 Strict, XHTML 1.0 Transitional 和 XHTML 1.0 Frameset。第一個用於純(pure)XHTML文檔,不使用來自HTML的任何已棄用的標記;第二個用於仍然使用不推薦的標記和屬性的過渡文檔;第三個用於框架集頁面。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
但是XHTML最重要的一個方面是它還引入了一種新的MIME類型,這是每個Web服務器應該用來提供XHTML的類型,以便瀏覽器知道他們必須使用他們的XHTML解析器和引擎而不是 他們的HTML解析器和引擎。這就是application/xhtml+xml:
Content-Type: application/xhtml+xml
5(XHTML的)骨感現實
在它推出之後,XHTML的一切看起來都很棒。我們的開發人員應該等待瀏覽器完全實現它,而Web開發的世界會突然變得更加快樂...
麻煩的是,以上從未發生過。
發生的事情是,一個特定的瀏覽器只是拒絕實現對application/xhtml+xml內容類型的支持。猜猜哪一個。是的,確切地說,就是它,IE瀏覽器。
當您嘗試訪問使用XHTML自己的內容類型的文檔時,IE11之前的版本顯示下載對話框,當然這意味著如果您希望能夠將您的網站顯示給IE用戶,則無法使用該內容類型。當這個問題被糾正時,已經太晚了。
幸運或者可能不幸的是,XHTML 1.0規範包含一個附錄,該附錄聲明XHTML 1.0的內容也可以使用HTML時代的舊的text/html內容類型來提供,以便於過渡。 這正是我們大多數人在過去幾年中所做的事情:創建XHTML 1.0內容,然後將其作為text/html提供。鑒於XHTML 1.0規範於2000年發布,過渡時間(transition)很長。
但事實是,當您將內容作為HTML而不是XHTML提供時,瀏覽器將使用其HTML引擎,而不是XHTML特定的引擎。盡管他們的HTML引擎已經支持XHTML,但它們仍然必須向舊的HTML 4代碼提供向後兼容性,這使得它們成為非常棘手的軟件。而且重要的是,它們缺少XHTML的一些最具XML的功能,首先就是嚴格錯誤處理。
如果你沒有嚴格錯誤處理, 您將擁有一個寬容的引擎,可以讓您提供格式不正確的文檔,自動糾正您的錯誤。如果你知道瀏覽器會糾正你的錯誤(以瀏覽器特定的方式),你可能永遠不會糾正你的文件......所以HTML恐怖故事仍在繼續。
知道這一點,考慮你可能從未真正創建過真正的XHTML網站。 您所做的是將(可能是格式不正確的)XHTML文檔作為普通的舊HTML提供和顯示。怎麽樣?
但它變得更糟,因為在2002年XHTML 1.1刪除了使用HTML內容類型的可能性, 因此只允許application/xhtml+xml。問題在於,不是強迫Internet Explorer支持application/xhtml+xml,事實是這種限制只是將XHTML 1.1轉變為與尼斯湖水怪一樣的神話生物。幾乎沒有人用過它。
在2009年,W3C再次允許使用帶有XHTML 1.1的text/html,但為時已晚。
6走向HTML5:一個分道揚鑣的故事
在某些時候(特別是2004年),一些瀏覽器廠商意識到現有的XHTML規範發展得太慢,無法應對web不斷增長的需求(視頻,音頻,更豐富的應用程序界面...),而W3C越來越多地推動它們朝對文檔進行更嚴格解釋的方向,最終可能導致大量(格式錯誤的)現有代碼無效。
他們希望通過視頻,音頻,本地存儲或高級表單處理等功能來增強Web應用,事實上,他們可以通過以瀏覽器特定的方式添加這些功能來實現,但他們不想再走不兼容的路。他們需要標準來發展並包含這些新功能。
然而,當時的標準(即XHTML)出現了一個問題:仍然有很多網站和應用仍然依賴於遺留的HTML,如果那些很酷的新功能通過嚴格的XHTML標準化了,所有這些應用永遠不能使用新功能,除非它們被完全重寫。每個人都想要一個更具互操作性和標準的網絡,但不能以丟失數百萬網絡開發者多年的工作為代價。
於是這些廠商(以及一些成員)向W3C提出了以一種發展HTML的想法,即讓所有(或大多數)現有HTML和XHTML代碼作為新HTML仍然有效,同時為Web應用程序提供強大的新功能,並且重要的是明確定義應該進行錯誤處理的方式。
後一點意味著瀏覽器不是在第一個問題上出錯,而是通過規範知道如何對Web開發者創建的錯誤進行自動糾正, 因此會以完全相同的方式對它們做出反應,從而有效地轉換HTML代碼(無論是否是XML格式),這完全跨瀏覽器。您仍然被建議為新網站創建XML格式的代碼,但如果您不喜歡或者您仍然擁有大量舊的遺留HTML(通常情況),您仍然可以參與。看那個舊的HTML網站嗎?讓我們添加一些視頻吧!這一切聽起來都很明智。
但事實是,所有這些對於W3C來說在2004年聽起來並不是那麽好,他們拒絕了這個提議,並決定嚴格遵守XHTML方式。 HTML對他們來說已經死了,沒有理由讓它復活,而XHTML 2.0就是未來。
這導致了分道揚鑣。HTML新概念的支持者,包括來自Opera Software,Mozilla Foundation和Apple的成員,離開了W3C並成立了Web Hypertext Application Technology Working Group (WHATWG),目的是定義我們今天所知的HTML5。
最後,在2007年,W3C創建了一個next-generation HTML工作組,後來接受了與WHATWG的合作,有效地采用HTML5作為他們的工作規範和未來的目標。 W3C和WHATWG現在已經聯合起來創建HTML5,而在2009年,W3C只是讓XHTML 2.0因關閉其規範的團隊而死去。
HTML5現在是Web標準的唯一未來。
7那麽HTML5是什麽?
HTML5是一套標準 - 截至2011年仍處於開發階段 - 從當前的HTML 4和XHTML規範發展而來,旨在:
- 為HTML添加高級新功能,有效地將Web開發從面向文檔的理念轉移到更加面向應用程序的理念。這些功能稱為HTML5 功能,在某些情況下,除了HTML5核心功能之外,它們本身也由標準定義。HTML5功能- - 包括:視頻,音頻,繪圖畫布,地理位置,本地存儲,離線支持和高級表單相關功能。
- 提供從HTML和XHTML遷移的無痛路徑,這使得HTML5的采用很少或根本不重寫代碼。
- 提供處理代碼錯誤的標準方法,以便格式錯誤的HTML5代碼在所有瀏覽器中以相同的可預測方式執行。
從實際的角度來看,這意味著只需將您的DOCTYPE更改為HTML5對應的,即可將當前的HTML和XHTML代碼(可能全部)視為有效的HTML5:
<!DOCTYPE html>
通過內容類型text/html提供內容:
Content-Type: text/html
在這裏你可能會想:為什麽DOCTYPE根本沒有指定DTD?因為沒有。HTML5沒有DTD,因為定義文檔是否有效的規則在規範中被定義為人類可讀的文本,但不能用DTD語言表示。
但這並不意味著HTML5解析器和引擎無法驗證。它可以。 它只需要是一個專門用於HTML5解析的程序,包括為執行驗證HTML5所涉及的規則而編程的特定代碼(而不是從DTD文件中讀取這些規則)。即使規範現在非常靈活,它仍然是一個規範,你必須遵守它。
但是如果沒有DTD,為什麽要有DOCTYPE子句呢? 因為需要DOCTYPE子句才能使瀏覽器以標準模式(Standards Mode)顯示文檔(而不是怪異模式Quirks Mode)。<!DOCTYPE html>可能是最小而有效DOCTYPE聲明,這正是我們所需要的。它只是一個開關。
8我可以使用HTML5了嗎?
大多數是的。 雖然(截至2016年)沒有完全實現整個HTML5功能集的瀏覽器,但大多數常見功能集確實實現了大部分功能。 因此,只要您的用戶不會遇到非常舊版本(現已不存在的)Internet Explorer,您在大多數情況下都應該沒問題。
另外,請註意瀏覽器支持實際上隨著時間的推移而發展,這不僅是因為瀏覽器發布新版本的速度很快,而且因為規範本身仍在進行中。
有關HTML5功能的列表以及相應的瀏覽器支持, 檢查Can I use… 站點。 值得註意的是,所有的HTML5功能的類別列表: http://caniuse.com/#cats=HTML5
9關於XHTML5?它存在嗎?
從理論上講,是的。XHTML5只是HTML5通過如下方式服務:
Content-Type: application/xhtml+xml
註意,IE11之前(Microsoft Edge支持)不支持此功能。 再次,考慮一下您用戶的瀏覽器功能。
註意,HTML5和XHTML5之間的區別僅僅在於內容類型,因為XML格式良好的HTML5文檔實際上是完全有效的HTML5文檔。這與HTML4和XHTML 1.0/1.1之間的關系完全不同,後者是不兼容的語言。
(譯)html,xhtml,html5歷史演變