萬盛學電腦網

 萬盛學電腦網 >> 網頁制作 >> Html5 >> 開發人員需知:HTML5性能分析面面觀

開發人員需知:HTML5性能分析面面觀

  以下這篇文章是由一位名為張黎明的IT技術人員所寫,其發表於InfoQ的網頁上。這次他在全文裡面從9個不同的方面分析HTML5的性能,還是很值得相應的開發人員閱讀的。

  從性能角度來說,HTML5首先是縮減了HTML文檔,使這件事情變得更簡單。第一,從用戶可讀性上說,原先一大堆東西,像初學者第一次看到這些東 西是看不懂的,而HTML5的聲明方式對用戶來說顯然更友好一些。 第二,文檔編碼的聲明,用HTML5方式的話,就很簡單。很多人問HTML5是什麼?我們說可以先用HTML5的方式就是把DOCTYPE先改了,因為目 前很多頁面都還是用傳統的方式。HTML5的方式,本身是兼容IE浏覽器的,從IE6到IE10都可以,包括高級浏覽器都支持。所以說擁抱HTML5最簡 單的方式就是把DOCTYPE給改了。

開發人員需知:HTML5性能分析面面觀  三聯教程

  1.更簡潔的標簽

  接下來可能並不是一件很常見的事情,但是卻是我比較推崇的,使用更簡潔的標簽方式。HTML5從這個名字大家可以聽出,它是從HTML4繼承過來 的。HTML4裡面有嚴格模式跟過渡模式,HTML5是支持這種過渡模式的,就是你可以不把一些標簽閉合。但是,我並不推薦所有的標簽,比方說BODY標 簽的不閉合,這種我們不推薦。但是像P標簽最常用的,還有列表標簽LI。為什麼這樣說?首先從視覺的角度來說,這樣的方式更簡潔一點。然後關鍵的是在文檔 傳輸過程中,內容會更少。

  HTML5標簽屬性的聲明支持三種方式:單括號、雙括號和不加括號。為了減少文檔大小,我是選擇不加雙引號的方式或單引號的方式。但是要注意,假設 是類屬性的聲明,因屬性可能包括多個類,多個類的時候則必須用括號括起來。在這方面,給大家看一下谷歌的一個實踐。谷歌自己有一個頁面完全實踐了上面的東 西,文檔的大小減少了20%,使HTML文檔的傳輸減少了20%。如果把整個都實踐起來,可以達到5%—20%之間的減少。這是第一步,縮減HTML文檔 的大小。

  2.圖片優化

  接下來是關於圖片的優化,圖片永遠是又愛又恨的元素。因為當圖片多的時候,會嚴重拖垮整個頁面的加載速度。關於圖片的優化方式,《高性能網站》書中已有很多介紹,總結起來主要有三點:使用精靈圖、優化圖片的大小,使用DATA URI,具體這裡就不細說了。

  圖片優化的另一個思路是:no-image。拋棄圖片,擁抱CSS3。原先需要設置一張圓角效果的圖片,現在使用CSS3中的 border-radius;原先需要設置陰影效果的圖片,現在使用CSS3中的box-shadow;原先需要設置漸變的背景圖片,現在使用CSS3中 的gradient。

  3.預取

  接下來講Prefetching,預取,是優化的另一個思路。我們現在優化的思路無非就是少。很多都是從少的角度,比方說前面把文檔大小減少,把圖 片的大小減少。很多張的圖片變成一張精靈圖,都是為了把發送請求的數量減少。預取的話,是另一種思路,提早加載好資源,用戶去點的時候,實際上已經加載 好,那肯定是更快了。

  預取,一共有兩部分:一部分是資源的預取,還有一部分是DNS的預解析。

  資源預加載有幾個點需要注意:

  預加載只是在浏覽器空閒的時候才會去拉,但不保證一定會去拉,這是很重要的一點。因為本身浏覽器有一個全局的監聽器,這是內部的一個接口,當浏覽氣空閒的時候,它會去執行浏覽器空閒的時候應該做事情,但是這個空閒的回調不一定被觸發,所以說並不保證一定會執行預加載。

  Chrome不支持HTTPS資源的預加載,像Alipay是HTTPS的頁面,Chrome不會去預拉取。

  一個預拉取的頁面雖存在後不可見,實際上它是在正常解析。假如說我預拉取登陸頁面,登陸頁面有很多資源,比方說有圖片,有CSS文件,JS文件。它 是從上往下正常的會被解析,解析的過程中,這個頁面沒有顯現,但是它實際上是存在的。在HTML5裡面,可通過 document.visibilityState得到當前頁面狀態,通常頁面有兩種狀態,可見與不可見,但是現在有一個新的狀態,叫做預渲染的狀態。可 以直接通過document.visibilityState 是否等於 prerender 來判斷頁面是否在預渲染狀態。

  4.DNS解析

  接下來是關於DNS的解析。有時候我們登入頁面,對用戶可能點的地方相對而言是比較難探測到,當然有時候我們會做一些埋點來探知用戶下一步行為大部 分是往裡走。但有些情況下,我們不知道用戶下一步具體會走到哪一個頁面的時候,但是我們知道他要走到哪一個域。這個時候,我就可以預解析DNS。因為實際 上,整個頁面的請求過程中間有一個很長的DNS的解析過程,如果說這個我們提前做了,就可以更進一步讓用戶看到這一頁面。

  以下是Q+壁紙的案例。Q+壁紙是Q+某一個系統系統,首先Q+整個的架構是基於WEB + 客戶端。我們現在看到的就是一個WEB的頁面,雖然它外面是一個客戶端的殼,但是它的心是WEB的。整個過程在我們第一次在完成的時候,因為圖片比較多, 所有的靜態資源是分配到十幾個靜態服務器上。也就是說,如果我要去拉的時候,我就要解析10個DNS,這個時間是相當耗時的,最慢的時候可能會延遲幾秒 鐘,這是我們肉眼能感覺到的。如果進行DNS預解析,因為本身資源我不知道具體是哪一個,所有圖片都是隨機的,所以我們只能說在DNS預解析上下功夫,來 提升它的速度。這樣的話,從原來可能需要2秒鐘,我就變成1秒鐘。

  接下來講Q+中的應用。我們會像QQ裡面一樣,QQ裡面跟Q+都有很多文字鏈,就是窗口的左下角有一個文字APP信息的推送。這邊是通過WEB時時 去拉取後端,後端拉取過來然後在前台顯示。但是在某一個時期,其實所有的APP它一共推送的運營信息是固定的。如果說按某個具體APP去分析每個文字鏈對 應數組的話,這個時候是非常大數據。因為這裡一個就大概有達到三四百個字節,從優化的角度說,我們把這些每次拉區過來的存在本地。再存上本地的 localStorage,我們是同一域,所有的APP之間的信息都是可以相互訪問的。然後就是把所有拉過的ID,就不會再重新拉一遍。

  在這裡也有一個需要注意的點,localStorage目前很多廠商的實現是同步的。如果你大量地調用localStorage這個接口,實際上他 會阻塞你的渲染進程。這個時候,當用戶往下拖動頁面的時候,然後你這個時候又正好在做存儲數據,這個數據又比較大,這個時候用戶就會感覺你這個頁面非常 卡。之前他們都有討論這個問題,本身這個接口的設計IE是設計成異步的,他們設計是成同步。這個會導致在調這個借口的時候,假設你程序比較多,因為有一個 序列化的過程,序列到磁盤。這樣的話,整個過程就會顯得比較慢。再加上本身localStorage可以做不同的窗口之間共享這個數據,它會在這個數據上 加鎖。如果大量地數據在調用這個本地接口,它就會顯得比較卡。所以目前沒有什麼特別好的解決方案,但是這是需要記住的。即使說目前最大的五點多兆,如果你 用了五點多兆,會讓用戶很悲催。因為你如果一去調用這個借口,用戶在拖用鼠標,就覺得非常卡。

  5.離線存儲

  接下來講離線存儲在性能方面給用戶帶來的好處。首先是進離線存儲的定義文件,在Q+中所有的系統模塊,都是有定義離線支持。就是說所有的應用,如果 網斷了,還是可以用。在文檔中加入MANIFEST的文件,MANIFEST是一個定義文件,聲明當前頁面哪些是需要存儲在本地的?哪些是不需要存儲的? 哪些如果說請求失敗,應該用哪些新的圖片或者什麼來代替?這樣分三塊:

  第一,CACHE,哪些需要存儲到本地。

  第二,NETWORK,是不會存儲在本地的,它每次都回去請求一遍但是這裡需要指出的是,本地存儲跟浏覽器存儲實際上是兩回事情,他們存的是兩塊不 同的地方。即使NETWORK這邊需要告訴APP說,我需要每次都拉一次,因為像Chrome,他這個存儲緩存是非常可惡的,比較難清除的,必須通過手動 去清除,才能完全生效。所以說你即使設置了不要讓它存儲在本地,但是浏覽器可能本身把它存儲起來了,因為他存的是兩塊不同地方。

  第三,FALLBACK。如果說一個圖片假如說請求失敗,它是404。那要用什麼圖片代替?我覺得這個比較好玩。

  MAEIFEST怎麼設置? MANIFEST這裡需要注意的是三點:

  MANIFEST同源限制;

  MIME類型必須為text/cache-manifest,這是標准的,如果是其他格式,都不會生效;

  CHROME,如果要看這個東西有沒有生效,可能通過CHROME這個偽協議的方式在浏覽器輸入,chrome://appcache-internals。

  關於如何去更新應用的緩存。為什麼要離線存儲?離線存儲在本地,當浏覽器知道你有離線存儲你,它會首先去離線存儲的目錄下,去找這個資源是否已經被 Cache。當它已被Cache的時候,他就直接從這邊拿到這個資源,不會再去發送一個請求。因為浏覽器的請求是這樣的,當有離線存儲的話,就連請求都不 會發,所以說會更快。 如果說有的時候我們需要更新,更新的時候怎麼辦?

  用戶可以手動去清除浏覽器的Cache,這個時候自動把本地存儲給清除了。

  修改MANIFEST的任何內容,這是比較推薦的方式,也是我們線上用的方式。就是說我們可以修改裡面的的具體項目,但是這裡應該最好是修改注釋, 因為我每次發布的時候,我們自動發布機制,發布的時候在上面注釋修改一下就可以了。這樣的話,每次發布的內容,都會實時同步到客戶端的本地;

copyright © 萬盛學電腦網 all rights reserved