無線頁面的開發在我們的日常工作中越來越重要,無線的效能也是我們需要重點關注的,而載入的效能又是無線效能中的一個重要問題。那麼,今天我們一起來看下如何去評估、測試無線頁面的載入效能。
為了方便分析頁面的載入過程,這裡將網路設定成最慢的 GPRS,並將載入過程錄製下來,通常你可以通過 Chrome 自帶的 timeline, 勾選 screenhot,可以得到詳盡的過程,如下圖:
這裡為了和請求一一清晰對照,用額外錄屏工具( licecap )錄製下來。下文以淘寶雙 11 男裝分會場的預發頁面作為測試,錄製 結果 gif 如下,錄製的 FPS 為 8。
幀分析如下:
第一幀:重新重新整理頁面,發起 HTML 請求,中間完整頁面是重新整理前的,請無視之。
終於等到第 7 幀,HTML 載入並解析完成,發出頁面中的請求,同時 CSS/JS 的地址都收斂在 //g.alicdn.com 同一個域名下, Chrome 下 HTTP 1.1 協議下一個域名下支援 6 個併發。
1 年前,PC 上以前還有多個域名分割槽(img01-04.tbcdn.cn),PC 上首屏圖片多,這樣可併發更多,但更多的域名引入,也加大了域名解析的成本,權衡之下淘寶之前圖片域名選擇了 4 個;後來集團經過轟轟烈烈的 HTTPS 改造,圖片推薦收斂到 gw.alicdn.com ;手淘下現在使用 SPDY + HTTPS,相比 HTTP 1.1 ,更安全且可以多路複用。
到第 20 幀, CSS 下載完,DOM 和 CSSOM 都準備 OK 了,頁面則開始渲染了;這是在 Chrome 下面看到的情況,但在 iOS 上並非如此,它需要 JS 載入並執行完才渲染頁面。
第 21 幀,緊接著,CSS 中的背景圖開始相繼渲染,可見 CSS 中渲染圖片也是有點耗時的。
第 23 幀,前面並行下載的 JS 都下載完,也開始執行了,看“瘋狂 top 榜”是 JS 抽取出來的。同時 aplus 請求也開始請求,這是個 getScript 的非同步請求,可見非同步請求真沒有阻塞頁面的渲染。
第 25 幀,JS 還在繼續執行,第一張圖片是 JS 根據當前 dpr、強弱網路、裝置寬度等算出最適合的圖片開始載入這張大 banner 了,並且開始傳送資料請求了。
到 27 幀,終於資料請求回來了,並且把文字和圖片渲染到頁面上了。
然後下一幀 28,開始請求商品圖片了。
到 45 幀,6 個圖片都在併發請求,同上 gw.alicdn.com 同一個域下併發 6 個請求。但首屏除了大圖外只有 4 張圖(2 張商家 logo 被底部 bar 擋住了),這裡發出了 6 個圖片請求,可見這個頁面的懶載入的 buffer 值可以設定得更小。
從 28 幀到 50 幀,經歷了很長的時間,第一張圖片終於顯示出來了。另外看到 aplus_v2 執行完後,又發起了 spm 等請求,後面 3 個請求( aplus-proxy.html/isproxy.js/m.gif )還是序列的。
最後到第 61 幀,終於所有的圖片都載入完了,最後看下,最後下載完的是大 banner 圖,因為有 46.9k ,這張圖的大小可能成為此頁面的 load 時間的關鍵;如果這張圖沒有這麼大,最後下載完的可能是用於埋點的 m.gif。
從上面整個請求的瀑布流分析下來,我們來回顧下頁面的關鍵時間點:
頁面可見時間
在第 20 幀頁面可見,CSS 完成之後,當然前提是這裡沒有外鏈 JS 在頁面中間因為網路請求嚴重阻塞頁面。這裡分析的僅僅是 Chrome 瀏覽器,不是真機,在 iOS 上,就算 JS 在底部,直接 <script src="xx"> 也是會阻塞頁面。可以通過加 async 屬性,通知渲染引擎這是不影響頁面渲染的 JS,可以非同步載入,iOS 下新增此屬性可實現和 Android 或 PC Chrome 一樣的效果。
重要內容可見時間
重要內容可見,這裡可以認為是商品資料,商品資料可見要等 JS 執行完並且非同步請求傳送出去回來後才可見。
TMS[1] 的非同步請求大多走招商資料平臺(TCE[2])的介面,測試其單個請求在真機的耗時約為 110ms(樣本較少,未大量測試)。
白屏時間和補救方法
在 Wi-Fi 下,這 60 多幀的過程一眨眼就過去了,但在弱網路下,如這裡最極端的網路 GPRS 下,整個首屏含圖片全部載入完成需要 41.25s。當然這 40 多秒過程能儘早出現內容,並漸進和諧地呈現出來是比較好的。
男裝頻道是修改過後的,對比之前的未處理的猜你喜歡頁面,出現長時間的白屏,如下:
以下為本地生活修復後的效果:
白屏處理只要稍微注意下就可以,修復的方便也簡單,儘量同步輸出,非同步輸出請儘量 mock 出現在首屏的模板。如果是基於 Cake[3] 工具開發的,也可以直接用首屏填充偽標籤。
結束語
以上在 Chrome 上的測試,但實際在手淘裡面,在 spdy、https、離線包內建資源等的影響下,它的瀑布流還是這樣的嗎?
注:
- [1]: TMS 為淘寶內部運營活動系統。
- [2]: TCE 為淘寶內部資料介面系統。
- [3]: Cake 為淘寶內部前端開發套件。