HTML5 之殤
英文原文:The Pain of HTML5
任何新技術面臨的關鍵問題之一是,要么被采用并且舍棄那些不能接受它的用戶;要么錯失新的發展機會,最終變成無關緊要的技術。比如,如果你要在 網站開發中使用 HTML5 技術,這就意味著要舍棄那些仍然使用舊版 IE 的用戶。不過開發者也可以通過兼容工作,讓用戶也能體驗到 HTML5 的價值,同時也可以利用這個機會,讓 HTML5 技術突顯出它的重要作用。
然而,并非所有的事情都能如人所愿。HTML5目前還處于發展的初級階段,部分特性還不能完美的實現。下面列舉出了 HTML5 的一些不足之處。
1. IE 瀏覽器
IE 瀏覽器是 Web 新技術發展道路上的絆腳石。IE6的輝煌時代已經結束,IE7也是這樣,即便是 IE8,也仍然不能稱為一款“現代瀏覽器”。而 IE9 對 HTML5 的支持尚不完全,比如不支持 Web Sockets 和 Web Workers。
由于 IE8 不支持 ECMAScript5,因此開發者必須考慮怎樣處理 array.IndexOf、array. each、Date.now ()、獲取和設置屬性、處理許多有用的 JavaScript 包。
在 IE8 和 IE9 中,用戶可以提交跨源請求,但不能使用 XMLHttpRequest。
只有 IE10 可以稱得上是“現代瀏覽器”,但是它不能在任何低于 Windows 8 的系統環境下運行。那么有多少比例的用戶正在使用 IE10 呢?
2. 離線存儲并不安全
當應用程序出現問題時,需要通過日志對它進行調查研究。但是如果應用程序運行好幾天也不能發送一個日志,開發者就需要考慮客戶端是否出現了問題。
日志記錄會使客戶端速度變慢、存儲量增長,而且如果在發現問題時才進行日志記錄就太晚了。而當前的 HTML5 技術,允許只存儲最新的日志信息,使性能影響降到最低,并且當問題再次出現時,用戶能夠進行恢復。
當然,理想的做法是在后臺寫入日志來實現某種形式的離線存儲(不影響客戶端的響應),這樣的話,當出現問題甚至是機器突然重啟,日志也能恢復。
這個過程可以通過 Webworker 中的 FileSystem API 來實現。然而,當前只有 Chrome 瀏覽器支持 FileSystem API。
用戶可以使用 localStorage 來代替 FileSytem API,可惜 localStorage 是一個同布 API,它的大量的數據將會增加加載時間。
更糟糕的是,實際上不能在本地機器上存儲未加密的日志,因為它們可能包含機密信息。然而目前的一些簡單的日志記錄方案看起來非常混亂,性能也不好,由于 HTML5 中沒有針對存儲的加密 API,開發者還需要自己對這些日志進行加密。
3. 不能很好的支持窗口間共享
有時候你可能想在不同的窗口中共享同一個服務器的連接信息,現在可以使用 postMessage 來實現,但是你需要有你想發送消息的窗口的句柄。但是如何得知用戶當前打開了哪些標簽頁呢?在 Chrome 中,不同的標簽頁使用不同的進程,這種功能對于創建長時間運行的應用程序非常有用。
在 Firefox 中不支持這一特性,但可以使用 SharedWebWorker 來代替。
你可以使用 onstorage 事件來對所有其他窗口進行廣播,但問題是,并不是所有的瀏覽器都能提供進行存儲事件的窗口的句柄。
4. Web Workers 細節尚未完全實現
通常情況下,當在 HTML 頁面中執行腳本時,頁面的狀態是不可響應的,直到腳本完成。而 Web Workers 是運行在后臺的 JavaScript,獨立于其他腳本,不會影響頁面的性能和操作。
但遺憾的是,Firefox 在 Workers 內部并不支持 WebSockets。
無論是 Chrome 還是 Firefox,都不能很好地解決基于代碼位置的 Worker 腳本無法實例化頁面本身的問題,因此代碼庫必須部署在為頁面提供服務的同一個 web 服務器上,并且不能包含在不同層級的頁面中,也無法在不更改代碼的前提下為腳本文件重命名。盡管規范明確指出,worker 腳本應該能夠被相關的腳本實例化。
總結
HTML5是美妙的,它讓開發者在研究新的、有趣的功能時候更有成就感。但是,當開發者遇到 HTML5 不能實現的功能或者不能很好支持該技術的瀏覽器時(特別是用戶都在使用舊版 IE 時),又會充滿挫敗感。
HTML5正在快速向前發展,并將逐步實現標準化,相信在不久的將來,本文所列出的這些不足之處都將不復存在,屆時,用戶將有一個完全不同的互聯網體驗。