前端性能优化有哪些手段?

进阶高频性能优化综合约 5 分钟读完

一句话回答

先测量,再优化:用 Lighthouse、Performance 面板和线上监控找到瓶颈,再按网络加载 → 资源体积 → 渲染 → 运行时分层优化。网络层靠缓存、CDN、HTTP/2 和压缩让资源更快到达;资源层靠代码分割、tree-shaking 和图片优化让资源更小;渲染层靠关键资源优先、减少回流和 SSR 让页面更早显示;运行时靠拆分长任务、防抖节流和 Web Worker 让交互不卡。

详细解析

先测量,再定位

  • 实验室工具:Lighthouse 给出整体评分和改进建议;DevTools 的 Performance 面板看主线程上的长任务,Network 面板看请求瀑布和资源体积
  • 真实用户数据:关注 Core Web Vitals,通过前端监控采集线上数据
  • 先判断瓶颈在哪:是网络慢、资源太大,还是主线程被占满,再对症下药

网络加载:让资源更快到达

  • 缓存:带 hash 的静态资源长期强缓存,HTML 走协商缓存(见 HTTP 缓存)
  • CDN:静态资源从离用户近的节点返回(见 CDN 的原理)
  • HTTP/2 和 HTTP/3:多路复用,减少连接开销和队头阻塞(见 HTTP 各版本的区别)
  • 压缩:文本资源开启 gzip 或 Brotli
  • 资源提示:用 preconnect、preload、prefetch 提前建立连接、加载资源(见资源提示)
  • 减少关键请求的数量和体积:减少重定向,首屏用不到的资源延后加载

资源体积:让资源更小

  • 代码分割与路由懒加载:用动态 import() 拆分代码,访问到某个页面时才加载对应的代码
  • tree-shaking:基于 ES Module 的静态结构,移除没有用到的代码
  • 组件库按需引入:只打包用到的组件和样式
  • 图片优化:使用 WebP / AVIF,用 srcset 提供响应式图片,非首屏图片懒加载(见图片懒加载)
  • 字体子集化:中文字体动辄几 MB,只保留页面用到的字符

渲染:让页面更早显示

  • 关键 CSS 内联:首屏需要的样式直接写进 HTML,其余 CSS 异步加载;非关键 JS 加 defer,不阻塞 HTML 解析
  • 减少回流和重绘:批量修改 DOM,动画用 transform(见回流和重绘)
  • 长列表虚拟滚动:只渲染可视区域内的元素(见长列表渲染)
  • SSR / SSG:服务端直接返回带内容的 HTML,改善首屏(见 SSR 和水合)

运行时:让交互更流畅

  • 拆分长任务:超过 50 毫秒的任务要拆开,及时让出主线程
  • 防抖节流:控制 scroll、input 等高频事件的处理频率(见防抖和节流)
  • Web Worker:把繁重计算移出主线程(见 Web Worker)
  • 避免内存泄漏:及时清理定时器、事件监听和全局引用(见内存泄漏)

框架层面的优化,比如组件懒加载、减少不必要的更新,见 Vue 项目的性能优化。

串起来看

阶段 主要手段 主要改善的指标
网络加载 缓存、CDN、HTTP/2、压缩、资源提示 TTFB、FCP、LCP
资源体积 代码分割、tree-shaking、图片和字体优化 FCP、LCP、TBT
渲染 关键 CSS、defer、SSR、虚拟列表、预留元素尺寸 FCP、LCP、CLS
运行时 拆分长任务、防抖节流、Web Worker INP、TBT

面试官可能追问

首屏优化具体怎么做?
  • 先看指标:FCP、LCP 慢在哪一段,是 TTFB、资源下载,还是渲染被阻塞
  • 缩短 TTFB:CDN、缓存,必要时用 SSR 或 SSG
  • 缩短关键路径:关键 CSS 内联,JS 加 defer,路由级代码分割,首屏只加载必要的代码
  • 优先加载 LCP 资源:preload、fetchpriority="high",首屏图片不懒加载
  • 首屏以外的内容延后:图片懒加载,非关键组件异步加载
  • 提升感知速度:使用骨架屏
怎么分析打包体积?

用可视化工具查看每个模块占了多少体积:Vite / Rollup 用 rollup-plugin-visualizer,webpack 用 webpack-bundle-analyzer。重点找体积大的依赖、被重复打包的依赖(比如同一个库的两个版本),以及没有按需引入的库。

JavaScript
// vite.config.js
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { visualizer } from 'rollup-plugin-visualizer'

export default defineConfig({
  // 构建后生成 stats.html,并自动在浏览器中打开
  plugins: [vue(), visualizer({ open: true })],
})
怎么证明优化有效?

用数据做前后对比。实验室数据要在相同的设备和网络条件下多次测量,取中位数;线上数据比较优化前后的分位数(如第 75 百分位),并按页面、设备类型分别看,避免被平均值掩盖。如果能关联到跳出率、转化率等业务指标,说服力更强。

易错点

  • 不要一上来就罗列手段,先讲怎么测量、怎么定位瓶颈
  • 优化有代价:代码块拆得太碎会增加请求数,preload 用多了会抢占关键资源的带宽,都要以数据为准
  • 首屏的 LCP 图片不能懒加载,否则 LCP 会变差

AI 模拟面试官

用自己的话回答,AI 对照参考答案打分、指出遗漏,再追问,最多 3 轮

登录后就可以和 AI 面试官对练,面试记录也会保存下来。登录

这道题你掌握了吗?

选一个最接近的状态,没掌握的题会出现在"我的进度 · 待复习"里。

学习记录暂存在本机浏览器。登录后自动同步到账号,换设备也能看到。