阅读 742

移动端浏览器前端优化策略

移动端的特点:设备屏幕较小、新特性兼容性较好、支持一些较新的 HTML5 和 CSS3 特性、需要与 Native 应用交互等。但移动端可用计算资源和网络资源极为有限,所以要做好移动端上的优化往往需要做更多的事情。

网络加载类

首屏数据请求提前

首屏数据请求提前,避免在 JavaScript 加载完成后才去后端请求数据。通常数据请求是页面内容渲染中关键路径最长的部分,而且不能并行,所以如果能将数据请求提前,可以很大程度上缩短页面内容的渲染时间。

首屏加载和按需加载

移动端网络资源有限,为了尽快完成页面内容的加载,需要保证首屏加载资源最小,非首屏内容使用滚动的方式异步加载。一般推荐移动端页面首屏数据展示延时最长不超过3秒。

inline 首屏必备的 CSS 和 JavaScript

为了在 HTML 加载完成时能使浏览器中有基本的样式,需要将页面渲染时必备的 CSS 和 JavaScript 通过 <script><style> 内联到页面中,避免页面 HTML 载入完成到页面内容展示这段过程中页面出现空白。

模块化资源并行下载

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

meta dns prefetch 设置 DNS 预解析

设置文件资源的 DNS 预解析,让浏览器提前解析获取静态资源的主机 IP,避免等到请求时才发起 DNS 解析请求。

<meta http-equiv="x-dns-prefetch-control" content="on" >
<link rel="dns-prefetch" href="//cdn.domain.com" >
复制代码

资源预加载

对于移动端首屏加载后可能会被使用的资源,需要在首屏完成加载后尽快进行加载,保证在用户需要浏览时已经加载完成。

利用MTU策略

通常情况下,我们 TCP 网络传输的最大传输单元(Maximum Transmission Unit,MTU)为 1500B,即一个RTT(Round-Trip Time,网络请求往返时间)内可以传输的数据量最大为 1500 字节。因此,在前后端分离的开发模式中,尽量保证页面的 HTML 内容在 1KB 以内,这样整个 HTML 的内容请求就可以在一个 RTT 内请求完成,最大限度地提高 HTML 载入速度。

缓存类

利用浏览器缓存

使用 Cache-Control、Expires、Etag 和 Last-Modified 来设置 HTTP 缓存,还可以使用 localStorage 等来保存从接口返回的数据,或者使用 localStorage 保存 CSS 或 JavaScript 静态资源内容,实现移动端的离线应用,尽可能减少网络请求,保证静态资源内容的快速加载。

静态资源离线方案

对于移动端或 Hybrid 应用,可以设置离线文件或离线包机制让静态资源请求从本地读取,加快资源载入速度,并实现离线更新。

尝试使用 AMP HTML

使用 AMP Component 中的元素来代替原始的页面元素进行直接渲染。

图片类

图片压缩处理

保证页面中所有用到的图片都是经过压缩优化处理的,而不是以原图的形式使用的。

使用较小的图片,合理使用 base64 内嵌图片

将小于2kb的图片转化成 base64 编码嵌入到 HTML 页面或 CSS 文件中,减少页面的 HTTP 请求数。

使用更高压缩比格式的图片

使用具有较高压缩比格式的图片,如 webp(需要设计降级兼容方案)等。在同等图片画质的情况下,高压缩比格式的图片体积更小,能够更快完成文件传输,节省网络流量。

图片懒加载

为了保证页面内容的最小化,加速页面的渲染,尽可能节省移动端网络流量,页面中的图片资源推荐使用懒加载实现,在页面滚动时动态载入图片。

使用 MediaQuery 或 srcset 根据不同屏幕加载不同大小图片

针对不同的移动端屏幕尺寸和分辨率,输出不同大小的图片或背景图能保证在用户体验不降低的前提下节省网络流量,加快部分机型的图片加载速度。

使用 iconfont 代替图片图标

在页面中尽可能使用 iconfont 来代替图片图标,因为 iconfont 体积较小,而且是矢量图,因此缩放时不会失真;还可以方便地修改图片大小尺寸和呈现颜色。

定义图片大小限制

加载的单张图片一般建议不超过 30KB,避免大图片加载时间长而阻塞页面其他资源的下载。

脚本类

尽量使用 id

选择器选取页面 DOM 元素时尽量使用 id 选择器,因为 id 选择器速度最快。

合理缓存 DOM 对象

对于需要重复使用的 DOM 对象,要优先设置缓存变量,避免每次使用时都要从整个DOM树中重新查找。

页面元素尽量使用事件代理,避免直接事件绑定

使用事件代理可以避免对每个元素都进行绑定,并且可以避免出现内存泄露及需要动态添加元素的事件绑定问题,所以尽量不要直接使用事件绑定。

使用 touchstart 代替 click

在移动端 touchstart 事件和 click 事件触发时间之间存在 300 毫秒的延时,在页面中没有实现 touchmove 滚动处理的情况下,可以使用 touchstart 事件来代替元素的 click 事件,加快页面点击的响应速度,提高用户体验。但同时我们也要注意页面重叠元素 touch 动作的点击穿透问题。

避免 touchmove、scroll 连续事件处理

对 touchmove、scroll 这类可能连续触发回调的事件设置事件节流,例如设置每隔 16ms(60 帧的帧间隔为 16.7ms,因此可以合理地设置为 16ms )才进行一次事件处理,避免频繁的事件调用导致移动端页面卡顿。

渲染类

使用 Viewport 固定屏幕渲染

在移动端设置 Viewport 可以避免缩放导致页面重排重绘。在移动端固定 Viewport 设置的方法如下。

<!--设置viewport不缩放-->
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no">
复制代码

避免各种形式重排重绘

页面的重排重绘很耗性能,所以一定要尽可能减少页面的重排重绘,例如页面图片大小变化、元素位置变化等这些情况都会导致重排重绘。

使用 CSS3 动画,开启GPU加速

使用 CSS3 动画时设置 transform:translateZ(0) 来开启移动设备浏览器的GPU图形处理加速,让动画过程更加流畅,但在 Native WebView 下 GPU 加速有几率产生 App Crash。

-webkit-transform:translateZ(0);
    -ms-transform:translateZ(0);
     -o-transform:translateZ(0);
        transform:translateZ(0);
复制代码

合理使用 Canvas 和 requestAnimationFrame

选择 Canvas 或 requestAnimationFrame 等更高效的动画实现方式,尽量避免使用 setTimeout、setInterval 等方式来直接处理连续动画。

SVG 代替图片

可以考虑使用 SVG 代替图片实现动画,因为使用 SVG 格式内容更小,而且 SVG DOM 结构方便调整。

不滥用 float

在 DOM 渲染树生成后的布局渲染阶段,使用 float 的元素布局计算比较耗性能,所以尽量减少 float 的使用,推荐使用固定布局或 flex-box 弹性布局的方式来实现页面元素布局。

不滥用 web 字体或过多 font-size 声明

过多的 font-size 声明会增加字体的大小计算,而且也没有必要的。

架构协议类

使用服务端渲染

服务端渲染的方式可以加快页面内容的渲染展示,避免空白页面的出现,同时可以解决移动端页面SEO的问题。

使用 NativeView 代替 DOM 的性能劣势

可以尝试使用 NativeView 的 MNV* 开发模式来避免 HTML DOM 性能慢的问题,目前使用 MNV* 的开发模式已经可以将页面内容渲染体验做到接近客户端 Native 应用的体验了。但需要避免 js Framework 和 native Framework 的频繁交互。

关注下面的标签,发现更多相似文章
评论