前端性能优化入门与案例实战

了解页面生命周期

  • 地址栏输入链接到页面展示的过程

    • 输入地址,创建网络请求线程: url 解析(协议,端口,路径),网络请求线程下载资源
    • 建立 TCP 连接,发送 HTTP 请求: dns 解析,tcp 连接(三次握手四次挥手)
    • 前后端的交互: 反向代理服务/负载均衡/防火墙(nginx)-> 后端以一个 http 响应数据的形式返回给前端
    • 关键路径渲染: html 解析,dom 树构建,css 解析,cssom 树构建,render 树构建,layout 布局,paint 绘制,composite 合成。

    页面生命周期

  • 优化方案

    • 加载优化
      • 减少 http 请求次数
      • 减少 http 请求大小
      • 使用 CDN 加速
      • 使用 http2.0
    • 构建优化
      • 优化 webpack 配置
      • 优化代码(压缩,去除无用代码,合并)
      • 优化图片(压缩)
      • 优化字体
      • 优化第三方库
    • 缓存优化
      • 优化缓存策略
      • 优化缓存位置
      • 优化缓存内容
    • 渲染优化
      • 优化关键渲染路径
      • 优化 css
      • 优化 js
      • 优化渲染流程(减少不必要的,重绘和回流)
      • 优化动画
      • 优化页面卡顿 页面生命周期页面生命周期

加载优化

  • 图片懒加载
    • 原理:图片不在可视区域内,不加载,等到滚动到可视区域内,再去加载
    • 实现:监听 scroll 事件,判断图片是否在可视区域内,如果在可视区域内,将 img 标签的 src 属性设置为真实的图片地址
    • api: IntersectionObserver/getBoundingClientRect 页面生命周期页面生命周期

构建性能优化

页面生命周期页面生命周期

  • 把字符串形式代码的代码转出 ast 语法树,用到 babel/parser

  • 对 ast 语法树进行遍历,找到对应的节点,进行替换,用到 babel/traverse

  • 把 ast 语法树转成字符串形式的代码,用到 babel/generator

    页面生命周期

  • webpack5 开启多线程打包

    • 原理:开启多个子进程,每个子进程都有自己的进程堆栈和内存空间,互不影响,可以并行执行任务
    • 实现:使用 thread-loader

页面生命周期页面生命周期页面生命周期

  • 生产环境,打包原则 页面生命周期页面生命周期页面生命周期页面生命周期

渲染优化

页面生命周期页面生命周期页面生命周期

  • 减少重排方案 页面生命周期页面生命周期

  • 验证重绘方法

    页面生命周期

  • 渲染性能优化(动画) 页面生命周期页面生命周期

  • 节流和防抖方案 页面生命周期页面生命周期页面生命周期页面生命周期

  • webWorker: 用于在后台运行脚本,不会影响页面的性能

    • 主线程和 worker 线程之间的通信
      • 主线程和 worker 线程之间的通信,通过 postMessage 方法,发送消息
      • 主线程和 worker 线程之间的通信,通过 onmessage 方法,接收消息
    • 计算密集型任务,使用 webWorker 页面生命周期页面生命周期

缓存性能优化

页面生命周期页面生命周期

  • 强缓存 页面生命周期页面生命周期页面生命周期

  • 协商缓存 页面生命周期页面生命周期页面生命周期页面生命周期

  • 如何选择缓存策略:强缓存优先级高于协商缓存

    页面生命周期

http 图文

http

参考资料