QQ音樂客戶端Web頁面通用性能優(yōu)化實踐
一、問題與目標(biāo)
1. 前端優(yōu)化的局限
無法規(guī)避 WebView 初始化耗時 受限于 WebView 生命周期范圍

2. 跨端優(yōu)化的局限
3. 目標(biāo)

二、指標(biāo)設(shè)計
1. 客戶端現(xiàn)有性能指標(biāo)數(shù)據(jù)

(1)客戶端 WebView 回調(diào)

其中,
onMainFrameFinished?取第一個非主請求 (HTML) 的資源被攔截的時機(jī)。對于絕大多數(shù)頁面來說,此時已經(jīng)完成主請求 (HTML) 的下載,并已經(jīng)開始解析;可以粗略代表主請求流程結(jié)束。
(2)W3C Performance Timing

2. 各端單獨采集的局限
(1)前端采集的局限
無法獨立獲取 WebView 開始初始化的時間點。 想獲取最精確的加載完成時間點,主要依賴手動埋點。
(2)客戶端采集的局限
CSR 頁面需在前端頁面框架加載后再展示數(shù)據(jù),內(nèi)容請求完成并上屏,發(fā)生在頁面加載完成之后 SSR 頁面的首次內(nèi)容上屏可攜帶首屏數(shù)據(jù),因此在頁面加載完成之前,頁面內(nèi)容已經(jīng)可以被消費


3. 指標(biāo)設(shè)計方案
最準(zhǔn)確的頁面加載完成時機(jī)來自前端 最準(zhǔn)確的 WebView 初始化時機(jī)來自客戶端
(1)前端側(cè)
前端通過手動埋點或監(jiān)聽 DOM 節(jié)點數(shù)變更,獲取加載完成時間點。 前端統(tǒng)計時調(diào)用客戶端提供 JSAPI,獲取以 WebView 初始化時間點作為起點的耗時。 并由前端完成加載耗時的計算和統(tǒng)計上報。

(2)客戶端側(cè)
前端? domInteractive?時,已完成所有頁面展示必需資源的請求和處理耗時的差異,可以體現(xiàn)任何頁面的客戶端通用優(yōu)化效果 可以衡量SSR(服務(wù)端渲染) 頁面的可消費耗時,和CSR(客戶端渲染)頁面的首幀耗時

webView.evaluateJavascript(script?=?“(function(){return?performance.timing.domInteractive;})();”,?callback?=?{?value?->?????responseEndDuration?=?value.toLong()?-?getOnCreateTimestamp()?}?)
雖然 WebKit 負(fù)責(zé)維護(hù) Performance Timing 的值,但是 WebView 并未提供接口獲取上述時間點的值。
三、優(yōu)化方案和效果
1. 優(yōu)化方案概述
TBS (X5 內(nèi)核) 環(huán)境預(yù)加載 WebView 實例池 主請求并行加載 Web 公共資源池 跟膚邏輯優(yōu)化


2. 優(yōu)化手段說明
(1)WebView 初始化
(2)客戶端自建緩存

(3)公共資源內(nèi)聯(lián)
單線程模型導(dǎo)致讀寫性能下降 被攔截資源的數(shù)量越多,對性能的影響越容易被放大
公共資源加載到熱緩存后,轉(zhuǎn)換為對應(yīng)的 HTML 節(jié)點 主請求并行加載完成后,直接在主請求字節(jié)流中替換其對應(yīng)的外聯(lián)節(jié)點;替換后的新字節(jié)流返回 WebView

3. 優(yōu)化效果
加載耗時降低 26.2% (1932ms → 1426ms) 跳出率降低? 停留時長中位數(shù)增加

四、跨端場景的瓶頸與對策
1. 前終端通信通道效能不足,考慮 “少次多量”
WebView 通道不支持較大量級數(shù)據(jù)的傳遞 通信線程多為單線程,甚至需要在主線程發(fā)起或處理通信 對傳遞次數(shù)的敏感程度大于對傳遞數(shù)據(jù)總量的敏感程度
2. 擴(kuò)展生命周期
3. 精簡 / 前置公共庫代碼
五、總結(jié)與展望
[1] 微信小程序的雙線程模型:
??愛心三連擊
1.看到這里了就點個在看支持下吧,你的「在看」是我創(chuàng)作的動力。
2.關(guān)注公眾號
程序員成長指北,回復(fù)「1」加入Node進(jìn)階交流群!「在這里有好多 Node 開發(fā)者,會討論 Node 知識,互相學(xué)習(xí)」!3.也可添加微信【ikoala520】,一起成長。
“在看轉(zhuǎn)發(fā)”是最大的支持
評論
圖片
表情
