aurora blog
  • JS

    • 基本汇总
    • Date时间
    • Array方法
    • String 方法
    • Object方法
    • RegExp正则
    • Es6 新特性等
    • Event-Loop
    • Http and Https
    • for in和for of区别
    • Web Worker
    • Promise && async
    • 堆内存 & 栈内存
    • JS设计模式探索
    • npm & yarn
    • Fetch和Axios的区别
    • 学习及面试问题整理
    • URL 输入到页面加载过程
    • 跨域&nginx本地项目代理
  • FE框架

    • react

      • 基本用法
      • react生命周期
      • hooks 16.8版本后
      • Route原理
      • Redux源码解析
      • React16 Fiber
      • React-VirtualDOM
      • React事件委托机制
      • React性能优化
      • 状态管理方案对比
      • React 18新特性
    • vue

      • vue 基本用法
      • vue 生命周期
      • VirtualDOM
      • vue 事件委托
      • vue 架构
      • vue 状态管理
      • 问题等
    • React-Native

      • React-Native 基本用法
    • 微前端

      • 遇到的问题
    • 鸿蒙 harmony

      • harmony 基础
  • 构建工具

    • webpack

      • Webpack配置详解
      • Webpack的使用
      • Babel-polyfill
      • webpack面试题
    • vite

      • vite配置详解
      • vite面试题
    • rollup

      • Rollup配置详解
      • rollup面试题
    • 构建工具对比
  • 性能优化

    • 性能优化策略
    • 缓存策略
    • 性能优化面试题
  • 浏览器

    • 浏览器渲染原理
    • 浏览器缓存机制
    • 浏览器面试题
  • 工程化

    • 代码规范
    • 工程化面试题
  • 前端安全

    • XSS 攻击与防护
    • CSRF 攻击与防护
    • 前端安全面试题
  • 移动端开发

    • 移动端适配
    • 移动端开发面试题
  • 前端监控

    • 错误监控
    • 性能监控
    • 前端监控面试题
  • Typescript

    • Typescript详解
  • Servers

    • Nodejs
    • Nginx
  • Git命令

    • git常用规范
  • 数据库

    • mongodb
    • mongodb
  • Other

    • Jenkins自动化部署

性能优化面试题

  • 基础概念
    • 前端性能优化的目标是什么?
    • 前端性能优化的方向有哪些?
  • 加载性能
    • 如何优化首屏加载时间?
    • 什么是关键渲染路径?如何优化?
    • 如何实现代码分割?
    • 图片优化的方法有哪些?
  • 运行时性能
    • 什么是重排和重绘?如何减少?
    • 防抖和节流的区别?应用场景?
    • 什么是虚拟滚动?如何实现?
  • 缓存策略
    • HTTP 缓存有哪些类型?
    • 如何选择合适的缓存策略?
    • Service Worker 缓存策略有哪些?
  • 性能指标
    • Web Vitals 包含哪些指标?
    • 如何测量页面性能?
  • 优化实践
    • 如何优化首屏加载?
    • 如何优化长列表性能?
    • 如何优化图片加载?
    • 如何优化动画性能?
  • 工具和监控
    • 常用的性能分析工具有哪些?
    • 如何实现性能监控?
  • 最佳实践
    • 性能优化的优先级是什么?
    • 性能优化需要注意什么?

基础概念

前端性能优化的目标是什么?

目标:

  1. 减少加载时间:首屏加载时间、可交互时间
  2. 提升运行时性能:减少卡顿、提升流畅度
  3. 优化资源使用:减少带宽、内存占用
  4. 提升用户体验:快速响应、流畅交互

前端性能优化的方向有哪些?

主要方向:

  1. 网络层面:减少请求数、压缩资源、使用 CDN
  2. 渲染层面:减少重排重绘、优化渲染路径
  3. 代码层面:代码分割、Tree Shaking、懒加载
  4. 资源层面:图片优化、字体优化、资源预加载
  5. 缓存层面:HTTP 缓存、Service Worker、应用缓存

加载性能

如何优化首屏加载时间?

优化策略:

  1. 代码分割:路由懒加载、组件懒加载
  2. 资源压缩:Gzip、Brotli、代码压缩
  3. 图片优化:WebP 格式、懒加载、响应式图片
  4. 关键资源内联:关键 CSS、关键 JS
  5. 预加载:DNS 预解析、资源预加载
  6. CDN 加速:使用 CDN 分发静态资源
  7. HTTP/2:多路复用、服务器推送

什么是关键渲染路径?如何优化?

关键渲染路径:

  • HTML → DOM
  • CSS → CSSOM
  • DOM + CSSOM → Render Tree
  • Render Tree → Layout
  • Layout → Paint

优化方法:

  1. 减少关键资源数量
  2. 减少关键资源大小
  3. 缩短关键渲染路径长度
  4. 内联关键 CSS
  5. 延迟非关键 CSS

如何实现代码分割?

方式:

  1. 路由分割:import() 动态导入
  2. 组件分割:React.lazy、Vue 异步组件
  3. 第三方库分割:单独打包 vendor
  4. 公共代码提取:SplitChunksPlugin
// 路由懒加载
const Home = () => import('./views/Home.vue');

// 组件懒加载
const HeavyComponent = lazy(() => import('./components/HeavyComponent'));

// 动态导入
if (condition) {
  import('./module').then(module => {
    // 使用模块
  });
}

图片优化的方法有哪些?

优化方法:

  1. 格式选择:WebP、AVIF、适当使用 PNG/JPEG
  2. 图片压缩:TinyPNG、ImageOptim
  3. 懒加载:loading="lazy"、Intersection Observer
  4. 响应式图片:srcset、sizes
  5. 雪碧图:合并小图标
  6. Base64:小图片内联
  7. CDN 压缩:使用 CDN 自动压缩

运行时性能

什么是重排和重绘?如何减少?

重排(Reflow):

  • 改变元素尺寸、位置、布局
  • 触发条件:修改宽高、位置、字体大小等

重绘(Repaint):

  • 改变元素外观,不影响布局
  • 触发条件:修改颜色、背景、边框等

减少方法:

  1. 使用 transform 和 opacity(触发合成层)
  2. 批量 DOM 操作(DocumentFragment)
  3. 避免频繁读取布局属性
  4. 使用 will-change 提示浏览器
  5. 使用虚拟滚动处理长列表

防抖和节流的区别?应用场景?

防抖(Debounce):

  • 事件触发后等待一段时间执行,期间再次触发则重新计时
  • 应用:搜索输入、窗口 resize

节流(Throttle):

  • 固定时间间隔执行一次
  • 应用:滚动事件、鼠标移动
// 防抖
function debounce(func, wait) {
  let timeout;
  return function(...args) {
    clearTimeout(timeout);
    timeout = setTimeout(() => func.apply(this, args), wait);
  };
}

// 节流
function throttle(func, limit) {
  let inThrottle;
  return function(...args) {
    if (!inThrottle) {
      func.apply(this, args);
      inThrottle = true;
      setTimeout(() => inThrottle = false, limit);
    }
  };
}

什么是虚拟滚动?如何实现?

虚拟滚动:

  • 只渲染可见区域的列表项
  • 适用于长列表场景

实现思路:

  1. 计算可见区域高度
  2. 计算可见项数量
  3. 只渲染可见项
  4. 滚动时更新可见项范围
class VirtualScroll {
  constructor(container, items, itemHeight) {
    this.container = container;
    this.items = items;
    this.itemHeight = itemHeight;
    this.visibleCount = Math.ceil(container.clientHeight / itemHeight);
  }
  
  render() {
    const startIndex = Math.floor(this.container.scrollTop / this.itemHeight);
    const endIndex = startIndex + this.visibleCount;
    const visibleItems = this.items.slice(startIndex, endIndex);
    // 渲染可见项
  }
}

缓存策略

HTTP 缓存有哪些类型?

强缓存:

  • Cache-Control:max-age、public、private
  • Expires:过期时间

协商缓存:

  • ETag / If-None-Match
  • Last-Modified / If-Modified-Since

如何选择合适的缓存策略?

静态资源:

Cache-Control: public, max-age=31536000, immutable

HTML:

Cache-Control: no-cache

API:

Cache-Control: private, max-age=300

Service Worker 缓存策略有哪些?

Cache First: 缓存优先,适合静态资源 Network First: 网络优先,适合动态内容 Stale While Revalidate: 先返回缓存,后台更新 Network Only: 只使用网络 Cache Only: 只使用缓存

性能指标

Web Vitals 包含哪些指标?

Core Web Vitals:

  1. LCP (Largest Contentful Paint):最大内容绘制,< 2.5s
  2. FID (First Input Delay):首次输入延迟,< 100ms
  3. CLS (Cumulative Layout Shift):累积布局偏移,< 0.1

其他指标:

  • FCP (First Contentful Paint)
  • TTI (Time to Interactive)
  • TBT (Total Blocking Time)

如何测量页面性能?

Performance API:

const perfData = window.performance.timing;
const pageLoadTime = perfData.loadEventEnd - perfData.navigationStart;

Performance Observer:

new PerformanceObserver((list) => {
  const entries = list.getEntries();
  // 处理性能指标
}).observe({ entryTypes: ['largest-contentful-paint'] });

Lighthouse:

  • Chrome DevTools 内置
  • 自动化性能测试
  • 提供优化建议

优化实践

如何优化首屏加载?

策略:

  1. 代码分割和懒加载
  2. 关键 CSS 内联
  3. 图片懒加载和优化
  4. 使用骨架屏
  5. 资源预加载
  6. CDN 加速
  7. 启用 Gzip 压缩

如何优化长列表性能?

方法:

  1. 虚拟滚动:只渲染可见项
  2. 分页加载:分批加载数据
  3. 防抖节流:优化滚动事件
  4. 使用 key:React/Vue 列表 key 优化
  5. 避免内联样式:减少重排

如何优化图片加载?

优化:

  1. 选择合适的格式(WebP、AVIF)
  2. 图片压缩
  3. 懒加载
  4. 响应式图片(srcset)
  5. CDN 加速
  6. 预加载关键图片

如何优化动画性能?

优化:

  1. 使用 transform 和 opacity(GPU 加速)
  2. 避免触发重排的属性
  3. 使用 will-change 提示浏览器
  4. 使用 requestAnimationFrame
  5. 减少动画复杂度
/* ✅ 好:GPU 加速 */
.element {
  transform: translateX(100px);
  opacity: 0.5;
}

/* ❌ 不好:触发重排 */
.element {
  left: 100px;
  top: 100px;
}

工具和监控

常用的性能分析工具有哪些?

浏览器工具:

  • Chrome DevTools Performance
  • Lighthouse
  • Network 面板
  • Memory 面板

在线工具:

  • WebPageTest
  • GTmetrix
  • Pingdom

监控工具:

  • Google Analytics
  • Sentry
  • 自定义性能监控

如何实现性能监控?

关键指标监控:

// LCP
new PerformanceObserver((list) => {
  const entries = list.getEntries();
  const lastEntry = entries[entries.length - 1];
  // 上报 LCP
  reportMetric('LCP', lastEntry.renderTime);
}).observe({ entryTypes: ['largest-contentful-paint'] });

// FID
new PerformanceObserver((list) => {
  list.getEntries().forEach(entry => {
    // 上报 FID
    reportMetric('FID', entry.processingStart - entry.startTime);
  });
}).observe({ entryTypes: ['first-input'] });

最佳实践

性能优化的优先级是什么?

优先级:

  1. 首屏加载:影响用户体验最关键
  2. 运行时性能:保证交互流畅
  3. 资源优化:减少带宽和内存
  4. 缓存策略:提升重复访问体验

性能优化需要注意什么?

注意事项:

  1. 不要过度优化
  2. 平衡性能和可维护性
  3. 关注实际用户体验
  4. 持续监控和优化
  5. 考虑不同设备和网络环境
最近更新:: 2025/11/20 14:50
Contributors: liyulai
Prev
缓存策略