H5页面性能优化方案参考

由于开发时间短,迭代速度快的特点,H5页面已大量用在各种移动端App和活动页中。响应时间作为和用户体验的重要部分,如果不能在这上面给用户可靠性和安全感,将会大大影响用户体验,进而影响用户使用产品的积极性。当页面并不复杂时,用户若能在1s内打开页面,看到信息的展示,会感觉速度还行,可以接受。当界面需要5s甚至以上才能显示时,对用户来说时不可接受的。

下文的标准和建议主要来自钉钉团队的H5性能优化方案

标准

通常来说首屏(onload)时间即资源加载完成时间建议在600ms内,首字时间时间在150ms内,根据网络类型做相应调整:

  • 2G,完全加载时间10s内,10s内占比80%
  • 3G,完全加载时间6s内,6s内占比60%
  • 4G和WiFi,完全加载时间3s内,3s内占比70%

(标准不是死的,上面只是举个范例)

这个时间可以在Chrome开发者工具里的Network中看到,也可以通过JS的performance API查询到

1
performance.timing.domContentLoadedEventEnd - performance.timing.connectStart

优化手段

资源加载

  • 按需加载,减少不必要资源的加载,不过这可能会增加页面的重绘
  • Lazyload,延迟加载,即不影响整体效果的图片展现给用户后再加载
  • 滚屏加载,根据字面意义,在下拉滚屏时加载额外数据,减少翻页时的重新加载和渲染
  • 响应式加载,即根据用户终端媒介加载不同大小的图片资源
  • 异步记载,异步加载第三方资源,防止影响本身的页面性能

此外,还有一些优化加载体验的方式:

  • 显示loading进度条,让用户能明确感知到页面的加载进度
  • 避免3xx、4xx、5xx的http状态码,因为3xx的跳转会影响加载时间,4xx和5xx通常是第三方资源的问题,可能会影响整个页面的展示。
  • favicon.ico,需要保证这个图标存在,且尽可能地小,并设置一个较长的缓存时间
  • 首次加载资源越小越好
  • 避免使用自定义中文字体(因为体积大)

图片使用

  • 格式,webp,jpg,png24/32较常用。jpg较为常用,避免使用png的大图片
  • 像素,一般来说不建议宽度超过640px
  • 合并,使用CSS Sprites,尤其是基本不变,大小类似的操作类型图标
  • 避免重设大小,即展示多大就加载多大的图片
  • 避免DataURL,DataURL是用Base64的方式,将图片变成一串文本编码放入代码的方式。尽管它能减少一次http交互的请求,但数据体积通常比二进制图片大1/3,且不会被缓存。
  • 使用替代方案,如CSS3,SVG或iconfont来完成简单的图片

服务端

  • Gzip,服务端要开启Gzip压缩
  • 设置合理的缓存时间,对静态资源,将缓存过期时间设置得长一些
  • 分域名部署,将动态资源和静态资源放置在不同的域名下,这样,静态资源请求时,不会带上动态域名中所设置的cookie头信息,从而减少http请求的大小
  • 减少Cookie,这部分数据使用的是上行流量,上行带宽更小,所以传输速度更慢,因此要尽量精简其大小。
  • CDN加速,部署CDN服务器,或使用第三方CDN服务,优化不同地域的接入速度。

代码

  • JS,CSS合并,除特殊情况外,所有JS压缩打包成一个文件,所有CSS压缩打包成一个文件,减少请求次数
  • 外联使用JS,CSS,有效利用缓存
  • 压缩HTML,JS,CSS,压缩代码可以减少大小到原来的1/3以下
  • 使用版本号标注JS、CSS等资源,让用户及时获取到最新的代码
  • 位置,通常CSS在前,JS在后。基础的JS文件,如日志,polyfill可以放在头部
  • 避免空src地址,在某些浏览器中可能会导致增加一个无效的http请求
  • 禁止CSS表达式,会让页面多次执行计算,造成卡顿等性能问题
  • 避免空css规则,降低渲染成本
  • 避免直接设置元素style,不利于复用和缓存,不过有些情况下确实是没有办法的办法

后台接口

  • 接口合并,尽量减少http请求次数
  • 缓存,在一些数据新旧敏感性不高的场景下,缓存接口数据