一、概述
1、背景
- 鉴于H5的优势,客户端的很多业务都由H5来实现,Webview成了App中H5业务的唯一载体 。
- WebView组件是IOS组件体系中非常重要的一个,之前的UIWebView 存在严重的性能和内存消耗问题,iOS 8之后推出WKWebView,旨在代替UIWebView;
- WKWebView在性能、稳定性、内存占用上有很大的提升,支持更多的html5特性,高达60fps的滚动刷新率以及内置手势;可以通过KVO监控网络加载的进度,获取网页title;
- 实践中,大部分App的H5业务将由WKWebview承载 。
从用户角度,相比Native页面,H5页面的体验问题主要有两点:
- 页面打开时间慢:打开一个 H5 页面需要做一系列处理,会有一段白屏时间,体验糟糕 。
- 响应流畅度较差:由于 WebKit 的渲染机制,单线程,历史包袱等原因,页面刷新/交互的性能体验不如原生 。
二、Webview打开H5
通过Webview打开H5页面,请求并得到 HTML、css 和 JAVAScript 等资源并对其进行处理从而渲染出 Web 页面 。
1、加载流程
- 初始化Webview -> 请求页面 -> 下载数据 -> 解析HTML -> 请求 js/css 资源 ->DOM 渲染 -> 解析 JS 执行 -> JS 请求数据 -> 解析渲染 -> 下载渲染图片-> 页面完整展示
文章插图
- DOM渲染之前耗时主要在两部分:初始化Webview 和 数据请求,一般Webview首次初始化在400ms这个量级,二次加载能少一个量级 。
- 数据请求依赖网络,网络请求一般经过:DNS查询、TCP 连接、HTTP 请求和响应 。数据包括HTML、JS和CSS资源,这些都是在webview在loadRequest:之后做的,这一阶段,用户所见到的都是白屏 。(虽然4G已经成为主流,但是4G延迟明显高于Wifi) 。
对H5页面的渲染,主要包括:渲染树构建、布局及绘制,具体可分为:
- 处理 HTML 标记并构建 DOM 树 。
- 处理 CSS 标记并构建 CSSOM(CSS Object Model) 树 。
- 将 DOM 与 CSSOM 合并成一个渲染树 。
- 根据渲染树来布局,以计算每个节点的几何信息 。
- 将各个节点绘制到屏幕上 。
3、总结
- 分析Webview打开H5打开的过程,我们发现,在H5优化中,前端重任在肩;
- 但是客户端也很重要,主要优化DOM渲染之前这些事情,可以做有:减少DNS时间、预初始化WebView 以及 HTML、JS、CSS等资源离线下载 。
- 列举在某业务中笔者实践过的比较trick的优化方案,然后再引出笔者认为理想的方案 。
推荐阅读
- 小微企业互联网营销不玩SEO优化还能做什么?
- 强烈推荐一款MySQL语句优化辅助工具,值得收藏
- 优化Python代码的4种方法
- mysql数据库查询优化的24条建议
- 优化WordPress网站的三个方法
- Java性能之优化RPC网络通信
- 每秒100W请求,架构如何优化
- 广告倒排索引架构与优化
- 网站跳出率高?从21个地方入手优化
- group by慢查询优化