腾讯NOW直播极限优化实践
如果无法正常显示,请先停止浏览器的去广告插件。
1. 探索H5性能天花板
腾讯NOW直播极限优化实践
腾讯 IVWEB 谢清贵
NOW直播
2. 个⼈人简介
2014年年 携程
旅游事业部
2017年年 ~ ⾄至今 腾讯
• 腾讯NOW直播
• IVWEB成员
• 主要负责移动Hybrid APP内业务以及前端性能优化
https://ivweb.io/
3. APP开发演进
迭代缓慢
必须跟客户端版本
开发&学习成本较⾼高
安卓&iOS需要两端分别开发⼀一套
客户端安装包很⼤大
所有业务都必须打包
原⽣生
Hybrid APP
H5⻚页⾯面打开速度慢
⽤用户等待⽩白屏时间⻓长
4. 原⽣生
H5
5. ⽤用户点击到显示⾸首屏的过程
JS下载 + 执⾏行行
WebView耗时
HTML loaded
505ms
Click Start
DOM渲染
⻚页⾯面渲染成功
JS执⾏行行完成
600ms
CSS 解析完成
CSS下载 + 解析
1155ms
1555ms
CGI数据拉取成功
CGI请求耗时
1700ms
6. ⾸首屏耗时分布
1
3
2
为何耗时这么⻓长?
7. 01
优化WebView耗时
8. WebView优化⽅方案
⻚页⾯面预加载
打开当前⻚页⾯面的同时,提前预加载其他⻚页⾯面
9. ⻚页⾯面预加载
10+个⻚页⾯面
预加载多少个⻚页⾯面?
• 预加载左右N个
• N = f(cpu, 内存, 机型…)
• f可以是阶段函数
什什么时机开始预加载其他⻚页⾯面?
• 等待当前⻚页⾯面完全加载成功后,开始预加载
• 固定延时(如2s)后,开始预加载
10. ⻚页⾯面预加载— 效果
11. 存在的问题
⽐比较浪费⽤用户流量量
对机器器的性能要求很⾼高
对未被预加载的⻚页⾯面⽆无效
12. WebView优化⽅方案
⻚页⾯面预加载
打开当前⻚页⾯面的同时,提前预加载其他⻚页⾯面
WebView H5框架预加载
只预加载框架部分,前端异步加载js并执⾏行行业务逻辑
13. 客户端打开⻚页⾯面
预加载框架
前端渲染
14. 预加载框架
Before Click
初始化
WebView
loadUrl(framework.html)
预加载框架
15. H5⻚页⾯面拆分
framework.html
公共HTML部分(⻚页⾯面结构,公共CSS等)
H 5
⻚页⾯面业务CSS
⻚页⾯面业务JS
业务
16. H5⻚页⾯面拆分 — framework.html
1
公共CSS
2
容器器
⼊入⼝口函数
3
17. H5⻚页⾯面拆分 — 业务
业务CSS
业务JS
18. 客户端打开⻚页⾯面
Click Start
创建
WebView
loadUrl(index.html)
19. 客户端打开⻚页⾯面
WebView
(framework.html)
getCurrentUrl —> url
Click Start
Use Loaded
WebView
获取当前被点击⻚页⾯面的真实URL
读取配置 —> config
从离线包读取当前⻚页⾯面对应的配置信息
通知前端
__startLoad(url, config)
20. 前端渲染
pushState(url)
改变当前⻚页⾯面的url同时不不刷新⻚页⾯面
__startLoad(url, config)
css loader
加载和解析业务css
js loader
加载和执⾏行行业务js
⻚页⾯面渲染
21. WebView H5框架预加载— 效果
22. 02
优化JS加载&执⾏行行
耗时
23. 优化JS加载⽅方案
PWA
利利⽤用离线缓存的特性
离线包
静态资源APP内置
24. 离线包机制
WebView资源请求
客户端拦截请求
通过_bid参数查找本地⽂文件
有
⽆无
返回本地⽂文件资源
继续⾛走线上请求
Response
25. 优化JS执⾏行行⽅方案
优化框架
升级框架库,剔除⽆无⽤用模块等
优化代码
常⽤用移动端优化⼿手段等
优化效果⼀一般
26. 优化JS执⾏行行⽅方案
优化框架
升级框架库,剔除⽆无⽤用模块等
优化代码
常⽤用移动端优化⼿手段等
前端本地缓存
将上⼀一次的HTML⽚片段和数据缓存到本地
27. 前端本地缓存
前端缓存HMTL + Data
缓存⾸首屏的HMTL⽚片段和数据
⻚页⾯面打开时,采⽤用本地缓存渲染
需要设置redux的initialState,否则会出现⼀一次刷新
⻚页⾯面渲染后更更新本地缓存
在合适的时机点更更新
28. 前端本地缓存
缓存机制:
• 客户端提供存储缓存的jsbridge(set)
• 客户端以内存和离线⽂文件的形式存在
• 客户端提供获取缓存的jsbridge(get)
29. 优点VS缺点
⾸首屏时间 ≈ WebView loadUrl时间
⾸首屏完全省去JS下载和执⾏行行时间 + CGI拉取数据时间,⻚页⾯面秒开
不不适⽤用于数据频繁更更新的场景
如直播场景等
⾁肉眼可以感知的画⾯面重绘
由缓存HTML到最新数据render会有⼀一次画⾯面刷新
30. 03
优化数据拉取耗时
31. 优化⽅方案
客户端预加载接⼝口数据
客户端提前帮忙预加载接⼝口数据
32. 客户端预加载接⼝口数据
loadUrl
CSS&JS
数据
渲染
Click Start
预加载数据
并⾏行行
33. 客户端预加载接⼝口数据
充分利利⽤用WebView打
开和js加载执⾏行行等待
的这段时间
34. ⼩小结
优化WebView耗时 优化JS加载&执⾏行行
耗时 优化数据拉取耗时
⻚页⾯面预加载 PWA 客户端CGI预加载
WebView H5框架预加载 离线包
前端本地缓存
35. 谢谢聆听!
微信公众号
QQ交流群
Github:https://github.com/feflow/feflow
更更多⼲干货,请扫码加⼊入腾讯IVWEB交流群
官⽅Github:https://github.com/iv-web