隨著移動網際網路的發展,我們越發要關注移動頁面的效能最佳化,今天跟大家談談這方面的事情。先,為什麼要移動頁面進行最佳化?
縱觀目前行動網路的現狀:
移動頁面佈局越來越複雜,效果越來越炫,直接導致了檔案越來越大,下載和執行速度越來越低,而速度低會造成不良影響,據統計:
71% 的多使用者期望移動頁面跟 PC 頁面一樣快,74% 的多使用者能容忍的響應時間為 5 秒,所以我們必須保證移動端頁面有足夠的速度。
移動頁面的速度跟三個因素有關,分別是:行動網路頻寬速度,裝置效能(CPU,GPU,瀏覽器),頁面本身。
目前主流的行動網路制式為 3G:
今年,我們還看到了 4g 網路制式在快速發展,這再一次提升了移動頁面的載入速度;
而移動裝置本身,截止到目前,以 iPhon6/三星 Note4 等裝置為,智慧裝置已經變得比以往螢幕更大,CPU 、 GPU 、記憶體更靠譜。
而與其同時,瀏覽器產商也為提升頁面的速度做出了不可磨滅的努力。
網路制式供應商,手機制造商,瀏覽器產商如此給力,我們呢?我們能做什麼。
我們能做得是對移動端頁面本身最佳化,這也是我們價值的體現,所以我們必須做移動端頁面效能最佳化。
該怎麼做移動端頁面最佳化呢?
在說這個前,要提一下 PC 常用的最佳化手段:
程式碼最佳化(css 、 html 、 js 最佳化)
減少 HTTP 請求(雪碧圖,檔案合併…)
減少 DOM 節點
無阻塞(內聯 CSS,JS 置後…)
快取
…
這些手段大部分適用於移動端,這都是一些耳熟能詳的手段,今天這裡就講了,有興趣可以參考 PDI 課程《網站效能最佳化》。
今天要講的主要是一些適用於移動端的最佳化手段,現在進入正題。
先我們得關注一下一個頁面從開始到呈現完畢需要經歷什麼階段,主要有四個階段:
每個階段的主要工作如上圖所示,而我們的最佳化目標是:
下面我們來針對上面的幾個階段細說一下都有哪些最佳化手段。
先,來看看載入中有哪些最佳化手段:
1. 預載入
預載入方式有兩種:
A. 顯性載入
類似這種多使用者能明顯感知的,我把它稱為顯性載入,互動頁面都建議加上這種載入方式,它一方面能增加頁面的趣味性,另一方面能讓後續頁面體驗更流暢。
B. 隱性載入
這種在載入張圖片的時候已經預先載入了第二張圖片,從而使得頁面體驗更流暢的方式,我把它稱為隱性載入,這種方式的好處是節省流量之餘又能使得體驗增強。
2. 按需載入
按需載入是不可或缺的最佳化手段,主要有以下兩種方式:
對於這種方式,在屏載入的時候把屏的內容載入儘量,而位於屏之外的元素都只在出現在屏時才載入,很大程度地節省了流量,提升了次載入時間。
這種叫響應式載入方式,意思是利用 JS 或者 CSS 判斷解析度,從而選擇不同尺寸的圖片進行引入,這種的好處顯而易見,同樣可以加快載入速度和節省流量。
3. 壓縮圖片
對於壓縮圖片,先要提的是 jpg 檔案:
對於移動端的 JPG 檔案,有這樣的結論:
使用大尺寸大有失真壓縮比的 jpg
使用 jpegtran 進行無失真壓縮
而對於 png 有以下結論:
多彩圖片使用 png24
低彩圖片使用 png8
推薦使用 pngquant
儘量避免重定向
為什麼要儘量避免重定向呢?因為如圖:
這是一個同一網速下的測試結果,重定向之所以會比較慢,是因為它重複了域名查詢,tcp 連結,傳送請求。
5. 使用其他方式代替圖片
有兩種方式,種是:依靠 CSS 3 繪製圖片:
第二種:使用 iconfont 代替圖片
但 iconfont 不一定比圖片好,這裡做了個實驗:
對於大圖片,iconfont 並不比雪碧圖好,建議單側小尺寸圖示才使用 iconfont.
然後,針對指令碼執行中有哪些最佳化手段,這裡只提兩點:
1. 儘量避免 DataURI
DataUri 在移動端並不如它在 pc 端吃香,因為:
經測試,DataURI 要比簡單的外鏈資源慢 6 倍,生成的程式碼檔案相對圖片檔案體積沒有減少反而增大,而且瀏覽器在對這種 base64 解碼過程中需要消耗記憶體和 cpu,這個在移動端壞處特別明顯。
2. 點選事件最佳化
在移動端請適當使用 touchstart,touchend,touch 等事件代替延遲比較大的 Click 事件。 Click 之所以慢是因為 mousedown 導致的:
然後,針對渲染階段中有哪些最佳化手段,這裡也只提兩點:
1. 動畫最佳化
a)儘量使用 css3 動畫
優點:
不佔用 js 主執行緒
可利用硬體加速
瀏覽器可對動畫做最佳化
缺點:
不支援中間狀態監聽
b)適當使用 canvas 動畫
優點:
可規避渲染樹的計算渲染更快
缺點:
開發成本高,維護較麻煩。
透過對 CSS 3 動畫和 Canvas 動畫對比:
得到結論:5 個元素以內使用 css3 動畫,5 個以上使用 canvas 動畫。
c)合理使用 RAF(requestAnimationFrame)
優點:
能解決指令碼問題引起的丟幀,卡頓問題
支援中間狀態監聽
缺點:
相容問題
透過 RAF 動畫與 settimeout 動畫對比:
得到結論:不需要相容 android 4.3 瀏覽器的情況下,請使用 RAF 製作指令碼動畫
2. 高頻事件最佳化
類似 touchmove,scroll 這類的事件可導致多次渲染,對於這種事件可以透過以下手段進行最佳化:
1. 使用 requestAnimationFrame 監聽幀變化,使得在正確的時間進行渲染
2. 增加響應變化的時間間隔,減少重繪次數。
後,針對合成/繪製只提一個最佳化手段:
GPU 加速
觸發 GPU 加速的方式有:
CSS3 transitions
CSS3 3D transforms
WebGL 3D 繪製
Video
…
使用 GPU 加速前有對比實驗:
GPU 加速實際上是大幅減少了合成/繪製時間,從而大大地提高了頁面速度,但 GPU 加速有自己的缺點:
過多的 GPU 層會帶來效能開銷,主要原因是使用 GPU 加速其實是利用了 GPU 層的快取,讓渲染資源可以重複使用,所以一旦層多了,快取增大,就會引起別的效能問題。
總結
本文針對頁面呈現的四個階段提出了比較典型的最佳化手段,到後,再提醒讀者一下:其實最佳化是雙刃劍。
按需載入提升速度,但可能導致大量重繪;
Touch 響應快,但很多場景不適合;
GPU 加速效率高,但記憶體開銷大等等
Loading 會讓整體體驗流暢,但容易造成多使用者流失
圖片壓縮讓頻寬成本降低,但可能會導致視覺效果變差
類似這樣的矛盾點還有很多,請結合業務按照實際情況進行最佳化。