← 返回首页
页面性能优化
页面性能优化是前端面试的高频考点,建议从加载性能和运行性能两大维度来组织回答。
加载性能优化(让页面更快显示)
减少请求数量
- 资源合并:合并 CSS、JS 文件,减少 HTTP 请求数。
- 雪碧图(Sprite):将多个小图标合并为一张图,通过
background-position定位。 - 字体图标 / SVG:替代小图标图片,减少图片请求。
减小资源体积
- 代码压缩:使用 Webpack、Vite 等工具压缩 JS、CSS、HTML(去除空格、注释、变量名混淆)。
- 图片压缩:使用 WebP 格式替代 JPEG/PNG,体积可减少 30%~50%。
- Gzip / Brotli 压缩:服务器开启压缩,文本资源可压缩 70% 以上。
利用缓存
- 强缓存:通过
Cache-Control: max-age和Expires,让浏览器直接使用本地缓存,不发请求。 - 协商缓存:通过
ETag/Last-Modified,让服务器判断资源是否变化,未变则返回 304。 - Service Worker:实现离线缓存,PWA 的核心技术。
资源加载优化
- 懒加载:图片、组件等进入视口时才加载。
- 预加载:
<link rel="preload">提前加载关键资源;<link rel="prefetch">预取可能用到的资源。 - CDN 加速:将静态资源部署到 CDN,就近访问,减少网络延迟。
- DNS 预解析:
<link rel="dns-prefetch" href="//cdn.example.com">提前解析域名。
首屏优先
- 关键 CSS 内联:将首屏所需的 CSS 直接写入 HTML
<style>中,避免阻塞渲染。 - JS 异步加载:使用
<script defer>或<script async>,避免阻塞 DOM 解析。 - SSR / 预渲染:服务端渲染,用户能更快看到内容。
运行性能优化(让页面更流畅)
减少重排(Reflow)与重绘(Repaint)
- 批量修改 DOM:使用
DocumentFragment或先display: none再修改。 - 避免频繁读取布局属性:如
offsetTop、getComputedStyle会触发重排,应缓存结果。 - 使用
transform和opacity做动画:这两个属性只触发合成(Composite),不触发重排/重绘,性能最好。
事件优化
- 节流(throttle):固定时间间隔执行一次,适用于
scroll、resize。 - 防抖(debounce):事件停止触发后延迟执行,适用于搜索框输入。
- 事件委托:将事件绑定到父元素,利用事件冒泡,减少事件监听器数量。
长任务拆分
- 时间分片:将大量数据处理拆分为多个小任务,用
requestIdleCallback或setTimeout分批执行,避免阻塞主线程。 - Web Worker:将耗时计算放到子线程中执行,不阻塞 UI 渲染。
虚拟列表
当渲染大量列表数据时(如 10000 条),只渲染可视区域内的项,滚动时动态更新,大幅减少 DOM 节点数量。
监控与度量
面试时提到监控指标,会显得更专业:
- FCP(First Contentful Paint):首次内容绘制时间。
- LCP(Largest Contentful Paint):最大内容绘制时间,衡量加载性能的核心指标。
- CLS(Cumulative Layout Shift):累计布局偏移,衡量页面稳定性。
- FID(First Input Delay):首次输入延迟,衡量交互响应速度。
这些是 Google 提出的 Core Web Vitals(核心网页指标),是衡量页面体验的官方标准。
一句话总结
性能优化 = 减少请求 + 减小体积 + 利用缓存 + 首屏优先 + 减少重排重绘 + 异步非阻塞
面试时不需要全部背下来,挑 3~5 个你最有把握的点深入展开即可。