前端优化 10s 到 100ms 是如何做到的?

2020-09-30 10:48:57 浏览数 (1)

Open signal 官方提供了2019年2月份统计的全世界4G网络覆盖率和通信速率的统计分布图如下,在目前移动互联网的浪潮下,我们要利用好用户终端设备的每个字节的流量。

页面性能和体验优化并不是一蹴而就的,需要不断的研究、跟踪,发现问题,解决问题。但是我们可以在一开始编写业务代码的时候就做的更好,做到极致。

加载渲染链路优化之道

从访问 URL 到页面呈现,整个链路可以做优化的思路。

幸运的是,W3C推荐的Navigation Timing标准中所定义的核心的页面性能数据,它包含了从上个页面销毁到跳转到当前页面加载完成每个阶段所消耗的时间。在canIuse上查到的兼容性也很好:

利用这个接口可以很方便的帮助我们排查链路问题。在Navigation Timing标准中介绍到这个API主要包含两个接口:PerformanceTiming和PerformanceNavigation,这两个接口由浏览器进行实现和维护,当浏览器创建页面的时候就会把接口定义的相关数据挂载到window.performance.timing和window.performance.navigation这两个属性上。我们可以打开一个网页看一下:

我们把这两个图对比一下,就可以很容易的排查出页面的加载链路问题。

静态资源链路

打开页面的第一步是请求页面的html,这里面涉及TTFB这个综合指标。同时如果有必要我们也可以统计DNS时间和TCP时间。

DNS时间:主要是根据请求域名查询到对应主机IP的时间。这个和DNS服务器有关系,也可能和本地缓存有关,如果这个很慢,可以找服务商排查下问题。

TCP时间:TCP 是承接 HTTP 协议的下层协议。主要是路由到主机 IP,并建立 TCP 链接的时间。这个时间反应了服务器到用户客户端之间链路是否通畅,网络是否通畅。

请求完HTML之后,就开始解析 HTML 代码,按照从上至下、自然顺序解析,解析内联 CSS代码或者加载外链CSS脚本,解析内联 Javascript 脚本,或者加载外链 Javascript 脚本。由于浏览器是单线程的,这些 CSS 和 Javascript 脚本很可能就会造成页面卡顿。

加载

CDN是内容分发网络,主要用于缓存静态资源。CDN服务商一般会在全国各地部署服务,而且带宽很大,这样访问CDN的资源时就可以有较短的路由路径,而且带宽也比较大,访问比较快。

解析渲染

加载完JS和CSS之后,浏览器开始解析执行。Chrome的渲染流程是这样的:

为了让浏览器更快的解析渲染,我们需要考虑这几点:

  1. CSS 嵌套层级不要太深,不超过3级,避免在最内层使用通配选择器。
  2. JS 脚本不要太复杂,考虑轻量化架构,降低 JS 复杂性,减少解析时间,尽量不要引用复杂的第三方脚本。
  3. 按需加载模块,按需打包,首页仅仅加载和执行和首屏相关的脚本。其他脚本延迟加载执行。
  4. 考虑依赖的第三方模块是不是必须,需不需要精简。
  5. 打包优化,code split 和 tree shaken。常用webpack和rollup的优化。
  6. 用户交互相关事件绑定(比如页面scroll,用户左右滑动等),添加参数{passive:true},减少浏览器事件等待。因为这些事件属于可阻止事件,浏览器不知道用户会不会阻止,所以需要等待js执行,然后再做响应。添加passive参数,就告诉浏览器不用等待了。
  7. iOS8 以后的 iOS 支持wkwebview,但是很多 App 之前用的还是 uiwebview,建议转换成wkwebview,获得性能的提升(UIwebview在执行 JS 时会阻塞 UI渲染进程,WKwebview不会)。

数据埋点

上面我们梳理了加载到解析渲染过程应该做的事情,那么如果你这些都做好了,发现网页表现依然不尽人意,那么你就要考虑做一下数据埋点。其实数据埋点在企业项目中也是必不可少的,和性能体验优化构成闭环。通过数据来发现页面性能和体验的问题,更有针对的进行解决。

事实上数据埋点分为三类:

  1. 业务埋点,统计诸如 PV、UV、点击率、流失率、转化率等
  2. 大数据埋点,统计与用户行为相关信息,比如那个用户点击了那个商品,上报用户 ID 和商品 ID,方便后台分析用户和商品的关系,可以用做大数据分析,推荐算法来为用户推荐商品。
  3. 工程埋点,统计工程上的数据信息,比如页面秒开率,DNS 时间等。

当然,实际的操作上不止这些,还有一些关于资源缓存的五种方案选择与缓存优化的五种方案。

0 人点赞