前端性能优化之移动端浏览器优化策略

上篇文章介绍了桌面浏览器的优化策略,相对于桌面浏览器,移动端 Web 浏览器上有一些较为明显的特点:设备屏幕小、新特性兼容性比较好、支持一些较新的 HTML5CSS3 特性、需要与 native 应用交互等。但移动端浏览器可用的 CPU 计算资源和网络资源极为有限,因此要做好移动端 Web 上的优化往往需要做更多的事情。首先,在移动端 Web 的前端页面渲染中,桌面浏览器上的优化规则同样适用,此外针对移动端也要做一些极致的优化来达到更好的效果。需要注意的是,并不是移动端的优化原则在桌面浏览器端就不适用,而是由于兼容性和差异性的原因,一些优化原则在移动端更具代表性。

网络加载类

1.首屏数据请求提前,避免 JavaScript 文件加载后才请求数据

为了进一步提升页面加载速度,可以考虑将页面的数据请求尽可能提前,避免在 JavaScript 加载完成后才去请求数据。通常数据请求是页面内容渲染中关键路径最长的部分,而且不能并行,所以如果能将数据请求提前,可以极大程度上缩短页面内容的渲染完成时间。那怎么将请求数据提前呢?建议采用首屏数据渐进式预加载的优化思路,具体如下:

1.优化首屏数据加载节点的速度。

2.预先加载首屏数据,使得多个串行节点并行化。
复制代码

接下来详细介绍优化步骤,第1点会在第一步优化中体现,但核心思路和主要优化收益更多体现在第2点:多个串行节点并行化。

Step1:资源文件下载与首屏数据请求节点并行

为了达到资源下载与数据请求并行的效果,我们充分利用了 HTTP Chunk 传输与浏览器的渐进式渲染特性:

将入口页分为静态片段和数据片段:静态片段包含了各个资源标签 (script,link),静态的导航栏,加载指示器等;数据片段则是包含首屏数据的内联脚本,大至如下:


复制代码

浏览器请求入口页时,入口页服务器 并行 做以下操作:

  • HTTP Chunk 方式输出静态片段

  • 请求首屏数据并在所有数据请求完成后将数据片段和应用初始化代码返回给浏览器。

注:http chunk 方式输出在 NodeJS 中及其容易满足,简单的 res.write(chunk) 即可。

Step2:应用初始化,资源文件下载,首屏数据请求节点并行

Step1 的基础上继续分析,应用初始化节点耗时也很明显,同时该节点要进行必须等待资源文件下载完毕,但理论上可以不依赖我们的首屏数据,还是可以让其和首屏数据请求并行。这里我们无法在 Step1 方案上直接将应用初始化和数据请求并行化,主要原因在于当首屏数据请求时间大于资源加载+应用初始化完成时间时,应用会在没有数据的情况下进入首屏渲染节点,从而导致异常。

解决方案是将数据片段的输出变成 promise 片段:

  1. pending promise 片段,与静态片段一起输出,大概如下:

复制代码
  1. resolve promise 片段,该片段在数据请求成功返回后输出,大概如下:

复制代码
  1. reject promise 片段,该片段在数据请求失败后输出,大概如下:

复制代码

2.首屏加载和按需加载,非首屏内容滚屏加载,保证首屏内容最小化

由于移动端网络速度相对较慢,网络资源有限,因此为了尽快完成页面内容的加载,需要保证首屏加载资源最小化,非首屏内容使用滚动的方式异步加载。一般推荐移动端页面首屏数据展示延时最长不超过 3 秒。目前中国联通 3G 的网络速度为 338KB/s(2.71Mb/s),所以推荐首屏所有资源大小不超过 1014KB,即大约不超过 1MB

3.模块化资源并行下载

在移动端资源加载中,尽量保证 JavaScript 资源并行加载,主要指的是模块化 JavaScript 资源的异步加载,例如 AMD 的异步模块,使用并行的加载方式能够缩短多个文件资源的加载时间。

4.inline 首屏必备的 CSS 和 JavaScript

通常为了在 HTML 加载完成时能使浏览器中有基本的样式,需要将页面渲染时必备的 CSSJavaScript 通过

你可能感兴趣的:(前端性能优化)