2024 性能优化 面试题学习笔记

201 阅读2分钟

0 定性能优化的目标

做性能优化之前,需要具体知道是哪些方面有性能问题,一般情况我们会先用 Performance API 来收集性能指标数据,比如:FP/FCP/LCP 、CLS/TTI/TBT等等,然后参考谷歌的 RAIL 模型, 有针对性的优化
(RAIL分别代表: Response:响应 Animation:动画 Idle:空闲 Load:加载)

结合浏览器的工作过程,可以分为5个阶段做性能优化:

1 网络通讯:减少请求次数、减少内容量

      • DNS 预解析 :dns-prefetch
      • 缓存:(强缓存和协商缓存),数据采用 localStorage 缓存
      • CDN:不经常改变的资源可以放在CDN
      • TLS 会话复用
      • 压缩合并 (js/css/图片/图标)
      • 减少 cookie 大小
      • 多域名
      • 图片:压缩、使用 webp 、使用 svg、去掉图片中的metadata、慎用base64、lazyload
      • 使用http2 : Push Cache是一种存在于会话阶段的缓存,当session终止时,缓存也随之释放****
      • 删除无用js、css

2 服务端:数据读写提速

      • 缓存
      • 上云
      • 服务器开启gzip(请求gzip资源)
      • 数据读写分离、分库分表等
      • graphql —— 合并接口

3 页面解析:

      • JS 放后面,或标注 defer、async
      • css 放前面
      • 尽量避免使用 iframe
      • Critical CSS
      • 精简 dom 层级

4 页面渲染:保持较高fps

      • 尽量避免重排
      • 使用 flexbox
      • 减少 dom 数量 —— 虚拟长列表
      • 优化 css 选择器结构
      • 尽量避免使用 table
      • 尽可能使用 gpu 加速
        • 过多地开启硬件加速可能会耗费较多的内存,因此什么时候开启硬件加速,给多少元素开启硬件加速,需要用测试结果说话

5 页面响应:

      • webworker 分离 CPU 操作
      • 尽量使用 requestAnimationFrame
      • 慎用闭包、全局状态
      • 避免死循环,慎用递归
      • 保持代码的优良设计,减少冗余代码
      • 不要在循环在重复读取页面样式
      • 避免使用 getBoundingClientRect 等接口
      • 灵活使用防抖节流

工程化手段: 防劣化

      • tree-shaking
      • code split
      • 按需加载
      • 微前端

结合云客服微应用改造,说说自己真实经历过的性能优化,要提现出更深入的认知

【亮点】熟悉JIT 优化:尽量复用函数、避免动态添加属性、尽量保持变量类型一致、避免数组元素类型转换