客户端内H5页面的首屏性能优化

简介: 客户端内H5页面的首屏性能优化

写在前面


性能优化是前端开发中不可避免的一个话题。本文将记录一次客户端内H5页面首屏性能优化的项目。


背景介绍


信息流App是当下最流行的产品之一,如今日头条等。我所在的团队也是在做这样一款信息流App。App的Feed流是客户端Native实现的。用户点击Feed流中的文章后,会进入到文章底层页。文章底层页大部分都是Native实现的,但是有一些文章的数据是非结构化的,Native没有办法很好地处理,所以用H5页面来承接这部分文章。整个业务场景很简单,用图表示如下:

640.jpg

毫无疑问,H5页面会极大影响App的用户体验。因此,H5页面的首屏性能十分重要,要争取能做到秒开。


优化前


优化前,H5底层页的加载流程如下:

640.jpg

上图的加载流程是一个很常见的页面加载流程。在这个流程中,至少包含了四次http请求。每一次http都会拖慢页面呈现的时间。如果是一个单独的H5页面,没有任何问题,但是这个页面是在客户端内,是要争取做到秒开的。


优化方案调研


首先考虑一下目前流行的解决方案。ssr

服务端渲染。服务端渲染是将数据请求和页面结构生成放到服务端完成,用户访问页面url时,接口吐出的就是完整的,带有数据内容的html,首屏速度自然会有提升。但是这里有几个问题:

1、目前的非结构化文章数据就是一大串HTML字符串,服务端不太好去处理一大串HTML的字符串。

2、就算实施了ssr,在用户访问H5底层页链接的时候,始终会有一次Http请求,首屏速度依然会收到网络环境等因素的影响。


离线包


一个完整的离线包方案,是根据业务模块配置,把H5页面和相关资源都打包上传,然后客户端在特定的时机对离线包进行预下载,解压、检验等工作,然后在特定的时机使用离线包里的本地文件等。离线包是一个不错的解决方案,但是离线包有一个问题:太重了。


轻量级的解决方案


权衡了各种因素后,我们采用了一种轻量级的解决方案。方案概述


640.jpg

  1. 前端在开发上线打包时,产出两个HTML模板文件,一个用于之前的逻辑,一个用于预加载逻辑。预加载HTML已字符串的形式写入后台的配置服务。将产出的js,css文件上传cdn,并且将cdn地址上传到后台保存。
  2. 用户访问客户端时,后台会通过预加载接口下发预加载数据,客户端将带有数据的HTML模板字符串保存在本地,同时下载静态文件保存。
  3. 用户访问H5底层页时,客户端直接load本地的HTML模板字符串,同时拦截webview的静态资源请求,直接使用提前下载好的js,css文件。


总结起来,就是后台提供预加载接口,准备好H5底层页需要的Html,文章数据,js,css等,用户点击进入到底层页时,客户端直接load本地的资源进行渲染。上面的示意图给出了完整的主流程。


方案补充


  • HTML预加载模板相关

iOS和Andorid对于拦截Webview中静态资源请求的方式不太一样,所以在预加载HTML模板中,需要对iOS和Android分别做逻辑。我是借助 webpack plugin 和后台的golang模板引擎来实现的。大致代码如下:


<!DOCTYPE html><html><head>    ...    <script>        var __articleContent__ = JSON.stringify({{.articleContent}});</script>    {{if eq .ostype "ios"}}        <link rel="stylesheet" type="text/css" href="./**CSSURL**/"/>    {{else}}        <link rel="stylesheet" type="text/css" href="/**CSSURL**/"/>    {{end}}</head><body>    ...    <main></main>    {{if eq .ostype "ios"}}        <script src="./**JSURL**/"></script>    {{else}}        <script src="/**JSURL**/"></script>    {{end}}    ...</body></html>
  • 校验与容错


客户端从预加载接口获取了静态资源后,会进行版本校验以及资源完整性校验,才会决定是否使用该预加载资源。如果HTML请求的资源与预加载的资源无法匹配,会去网络获取资源。当预加载出错时,客户端会走老的那一套逻辑,即:访问H5文章底层页的链接。


方案总结


  • 直接将数据写入html,省去了H5页面请求接口拉取数据的开销。
  • js,css等静态资源预加载,需要时直接从本地load,省去了H5页面通过网络获取静态资源的开销。
  • 轻量级方案,整个过程可控,H5页面上线和更新的流程简单。


写在后面


本文总结了特定场景下,App内的H5页面首屏性能优化方案。最终上线后的详细数据就不再给出了,只能说:肉眼可见的快。整个方案是由前端发起的,在方案实施的过程中,我也学到了挺多的东西,不仅仅是技术上的。符合预期。

推荐阅读


当考虑网页首屏时长优化的时候,我们在考虑什么?


使用service worker做缓存来加快首屏速度,可行么?

相关文章
|
存储 JavaScript 安全
基于Springboot和vue的餐饮管理系统的设计与实现
基于Springboot和vue的餐饮管理系统的设计与实现
|
5月前
阿里云短信签名是什么?审核不通过怎么办?
阿里云短信签名需为企事业单位名、App名或商标名,符合工信部实名制要求。不支持模糊、测试类及个人名称。确保资质一致、链接有效、授权完整,以提升审核通过率。查看详情参与优惠活动。
247 0
|
SQL 数据可视化 数据处理
使用SQL和Python处理Excel文件数据
使用SQL和Python处理Excel文件数据
886 0
|
5月前
|
数据采集 监控 前端开发
n8n-workflows:4300+ 自动化工作流的开源数据中台方案
n8n-workflows 是一个开源低代码工作流模板库,集成4343个模板、365个主流API,助力量化交易数据采集、信号处理与风控监控。支持快速部署与API调用,适用于中低频策略研发,显著降低开发成本,提升效率。
|
Web App开发 移动开发 安全
h5页面的优缺点(浅谈)
H5页面优点包括:跨平台性,易于传播,丰富的多媒体支持,开发成本低,更新便捷,良好的交互性。缺点则有:性能受限,功能受限,高度依赖网络,存在安全风险,用户体验一致性差。确保H5页面在不同设备上的兼容性,需遵循HTML5标准,使用响应式设计,并进行多设备测试。优化H5页面性能的方法包括减少HTTP请求,压缩文件大小,利用缓存机制,优化代码执行效率等。
|
前端开发 容器
如何利用CSS实现三角形、扇形、聊天气泡框
如何利用CSS实现三角形、扇形、聊天气泡框
690 0
|
移动开发 人工智能 文字识别
如何在H5中实现OCR拍照识别身份证功能
如何在H5中实现OCR拍照识别身份证功能
1052 0
|
JavaScript Android开发
|
缓存 移动开发 JavaScript
WKWebView对网页和js,css,png等资源文件的缓存机制及如何刷新缓存
WKWebView对网页和js,css,png等资源文件的缓存机制及如何刷新缓存
1326 1
|
人工智能 自然语言处理 搜索推荐
AIGC: 2 语音转换新纪元-Whisper技术在全球客服领域的创新运用
全球客服领域的发展设想结合点: 1.智能客服语音助手: 2.多语言无缝服务体验: 3.语音分析与情感智能
1574 2