为什么要进行性能优化?

  • 57%的⽤户更在乎⽹⻚在3秒内是否完成加载

  • 52%的在线⽤户认为⽹⻚打开速度影响到他们对⽹站的忠实

  • 每慢1秒造成⻚⾯ PV 降低11%,⽤户满意度也随之降低降低16%

  • 近半数移动⽤户因为在10秒内仍未打开⻚⾯从⽽放弃

PV: 一天网站一个页面被访问的次数,即浏览量
UV: 独立访问人数,即用户量

性能白皮书open in new window

性能优化学徒工

  • 雅虎军规
  • 缓存策略
  • 网站协议
  • 小字优先

雅虎军规践行

可以用一张图来表示,能压缩的尽量压缩,谁大压缩谁。

performance
  • Google浏览器同一个域下请求并发为6,大小100k左右,压缩后30k
  • 使用CDn,是因为不会携带多余的cookie。使用多个CDN,解决浏览器对同一域名的并发。

缓存策略

强缓存 > 协商缓存

cache-control > expires > etag > last-modified

performance-cache

平时实际例子:

  1. 常用的库 Jquery,对版本要求不是很高,一般设置为强缓存,只需要跟服务器校验
  2. 业务代码,通常是本地缓存,md5发生改变重新请求。
    a. 首先先查看本地是否有该文件的缓存 b. 有,判断是否过期 i. 未过期,直接取缓存里的代码 ii. 已过期,删除key值,拉取文件。储存响应回来的etag、last-modified 等,增加新的key code c. 无,直接拉取文件,并增加key code、etag等
  3. 浏览器中 localStorage 5M, web SQL 50M

网络协议

通过升级http协议,HTTP2 多路复用

浏览器请求顺序:

  1. 解析域名
  2. http连接
  3. 服务器处理文件
  4. 返回数据
  5. 浏览器解析、渲染文件

http1.0 中没有keep-alive 长连接,所以每次发送请求时,都需要建立http请求。

http1.1 中添加了 keep-alive,默认长连接。就是为了解决,同一域名内多次请求数据,只建立一次http请求。其他请求可复用每一次建立的连接通道,以达到提高请求效率的问题。

但还是存在问题:

  • 串行的文件传输

  • 连接数过多

http2.0 多路复用是基于流,同一域名下不管访问多少文件,都只建立一路连接。

同样的Apache的最大连接为300, 有个这个新特性后,最大并发数就可以提升到300, 比原来提升了60倍!🎉

计算并发数

拿Google来做例子,浏览器发起最大的连接数为6。那么服务器能承载的最高并发数为50(300/6),当第51个人访问的时候,就需要前面的某个请求处理完成。
http2.0

渲染加载

详细流程参考 DOM 渲染过程

资料参考参考 现代浏览器渲染过程

结论

尽量避免 DOM 大量的 重绘/重排

CSS阻塞问题

详细流程参考 CSS I/O 阻塞优化

结论

  1. CSS 会堵塞 DOM 渲染<但不会影响 DOM 的解析>

  2. CSS 加载会阻塞后⾯的 js 语句的执⾏<已⾃⼰实际看到的为准>

  3. CSS 会堵塞 DOMContentLoaded<同时存在css和js的时候>

页面加载

各项指标信息,移步至 页面性能指标

根据不同的情况做调优

白屏原因

why_white_screen

主要分为

  • css & js 文件获取 阻塞
  • js 文件解析
  • dom 生成
  • cssom 生成

优化调优

  • 包含基本 dom
  • 基本的 css
  • 骨架屏

vue 中的各个阶段

vue_schedule

created 阶段 为 FP 阶段,只有空节点

mounted 节点 为 FCP 节点,包含基本的空节点,没有数据

update 阶段 为 FMP 阶段 挂载数据,视图更新

优化调优

在 FP 阶段,创建简单的骨架片,基本的 dom 结构

结论

主要由一下几点出发

总结 🍺

  1. 雅虎军规
  2. 渲染加载
  3. 页面加载
  4. Node加载
  5. 慎用缓存

一个 字走天下,一个性能监控啥也不怕

几种对比

优/缺CSR预渲染SSR同构
优点
  • 不依赖数据
  • FP时间最快
  • 客户端用户体验好
  • 内存数据共享
  • 不依赖数据
  • FCP时间比CSR快
  • 客户端体验好
  • 内存数据共享
  • SEO友好
  • 首屏性能高,FMP比CSR和预渲染快
  • SEO友好
  • 首屏性能高,FMP比CSR和预渲染快
  • 客户端用户体验好
  • 内存数据共享
  • 客户端与服务端代码共用,开发效率高
缺点
  • SEO不友好
  • FCP FMP慢
  • SEO不友好
  • FMP慢
  • 客户端数据共享成本高
  • 模版维护成本高
  • Node容易形成性能瓶颈
Last Updated:
Contributors: kk