騰訊音樂(lè)移動(dòng)端頁(yè)面通用性能優(yōu)化實(shí)踐
一、問(wèn)題與目標(biāo)
1. 前端優(yōu)化的局限
無(wú)法規(guī)避 WebView 初始化耗時(shí) 受限于 WebView 生命周期范圍

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

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

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

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

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


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

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

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


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

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

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

四、跨端場(chǎng)景的瓶頸與對(duì)策
1. 前終端通信通道效能不足,考慮 “少次多量”
WebView 通道不支持較大量級(jí)數(shù)據(jù)的傳遞 通信線(xiàn)程多為單線(xiàn)程,甚至需要在主線(xiàn)程發(fā)起或處理通信 對(duì)傳遞次數(shù)的敏感程度大于對(duì)傳遞數(shù)據(jù)總量的敏感程度
2. 擴(kuò)展生命周期
3. 精簡(jiǎn) / 前置公共庫(kù)代碼
五、總結(jié)與展望
[1] 微信小程序的雙線(xiàn)程模型:
評(píng)論
圖片
表情
