前端面试之吊打面试官 性能优化篇

72 阅读3分钟

一、图片懒加载:原理与实现

1.1 基本概念

图片懒加载(Lazy Loading)是一种优化网页性能的关键技术,它通过延迟加载非可视区域内的图片资源,显著提升页面加载速度。根据Google的研究,合理使用懒加载技术可以使页面加载性能提升30%以上。

1.2 核心原理

<!-- 传统加载方式 -->
<img src="image.jpg" alt="示例图片">

<!-- 懒加载实现方式 -->
<img data-src="image.jpg" class="lazyload" alt="示例图片">

实现流程:

  1. 将真实图片URL存储在data-*属性中(如data-src)
  2. 使用Intersection Observer API监听元素可见性
  3. 当图片进入视口时,将data-src的值赋给src属性
  4. 移除监听器避免重复加载

1.3 现代实现方案

const lazyImages = document.querySelectorAll('img.lazyload');

const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      const img = entry.target;
      img.src = img.dataset.src;
      observer.unobserve(img);
    }
  });
}, { threshold: 0.01 });

lazyImages.forEach(img => observer.observe(img));

优势对比

方案兼容性性能实现复杂度
scroll事件监听
IntersectionObserver

二、性能优化核心:节流与防抖

2.1 节流(Throttle)

function throttle(fn, delay) {
  let lastTime = 0;
  return function(...args) {
    const now = Date.now();
    if (now - lastTime >= delay) {
      fn.apply(this, args);
      lastTime = now;
    }
  };
}

// 使用示例
window.addEventListener('scroll', throttle(handleScroll, 200));

应用场景

  • 滚动加载更多内容
  • 窗口resize事件
  • 游戏中的按键处理

2.2 防抖(Debounce)

function debounce(fn, delay) {
  let timer = null;
  return function(...args) {
    clearTimeout(timer);
    timer = setTimeout(() => {
      fn.apply(this, args);
    }, delay);
  };
}

// 使用示例
searchInput.addEventListener('input', debounce(handleSearch, 500));

性能对比

  • 节流:保证至少每X毫秒执行一次
  • 防抖:只在最后一次操作后X毫秒执行

三、SPA首屏优化方案

3.1 问题根源分析

典型SPA首屏加载流程:

  1. HTML文档下载(100-500ms)
  2. JS/CSS资源加载(1-3s)
  3. 框架初始化(500ms-1s)
  4. API数据请求(500ms-2s)
  5. 最终渲染(200-500ms)

3.2 优化方案矩阵

优化方向具体措施预期收益
资源加载代码分割 + 预加载减少30%-50%JS体积
渲染优化服务端渲染(SSR)提升FP时间40%+
数据获取数据预取 + 缓存减少API等待时间
静态资源CDN分发 + WebP提升图片加载速度

3.3 Vue专项优化

// 路由懒加载最佳实践
const Home = () => import(/* webpackChunkName: "home" */ './views/Home.vue');
const About = () => import(/* webpackChunkName: "about" */ './views/About.vue');

// 组件级优化
export default {
  data() {
    return {
      heavyData: null
    }
  },
  async created() {
    // 数据预取
    this.heavyData = await fetchCriticalData();
  }
}

四、性能指标深度解析

4.1 核心指标说明

在这里插入图片描述

  • FCP优化:内联关键CSS、预加载字体
  • LCP优化:图片懒加载、优先加载英雄图片
  • CLS优化:预留图片占位空间、避免动态内容插入

4.2 性能评分标准

指标优秀需要改进
FCP<1s1-2.5s>2.5s
LCP<2.5s2.5-4s>4s
CLS<0.10.1-0.25>0.25

五、Webpack深度优化

5.1 构建配置示例

// webpack.config.js
module.exports = {
  optimization: {
    splitChunks: {
      chunks: 'all',
      cacheGroups: {
        vendors: {
          test: /[\\/]node_modules[\\/]/,
          priority: -10
        }
      }
    }
  },
  plugins: [
    new BundleAnalyzerPlugin(),
    new CompressionPlugin({
      algorithm: 'gzip',
      threshold: 10240
    })
  ]
}

5.2 优化前后对比

指标优化前优化后提升
打包体积5.2MB1.8MB65%
构建时间45s28s38%
请求数量12650%

六、CDN加速原理详解

6.1 工作流程

sequenceDiagram
  用户->>边缘节点: 请求资源
  边缘节点->>源站: 首次请求回源
  源站-->>边缘节点: 返回资源
  边缘节点->>用户: 返回资源并缓存
  用户->>边缘节点: 再次请求
  边缘节点->>用户: 直接返回缓存

6.2 配置建议

# Nginx配置示例
server {
  location ~* \.(jpg|png|gif|js|css)$ {
    expires 365d;
    add_header Cache-Control "public";
    add_header CDN-Cache "HIT";
  }
}

七、终极优化清单

  1. 关键渲染路径优化
    • 内联关键CSS
    • 异步加载非关键JS
    • 预加载关键资源
  2. 图片优化
    • 使用WebP格式
    • 实现响应式图片
    • 设置合适的尺寸
  3. 缓存策略
    • 配置强缓存(Cache-Control)
    • 实现协商缓存(ETag)
    • Service Worker缓存
  4. 现代技术应用
    • HTTP/2服务器推送
    • Brotli压缩
    • 边缘计算(Edge Computing)

八、性能监控方案

推荐工具组合:

  1. 开发阶段:Lighthouse + Webpack Bundle Analyzer
  2. 生产环境:RUM(Real User Monitoring)
    • Google Analytics
    • New Relic
    • 自建性能监控系统
// 自定义性能监控示例
window.addEventListener('load', () => {
  const timing = performance.timing;
  const loadTime = timing.loadEventEnd - timing.navigationStart;
  console.log(`页面加载耗时:${loadTime}ms`);
  
  // 发送到监控服务器
  navigator.sendBeacon('/analytics', { loadTime });
});

通过系统性地实施这些优化策略,可以使网页性能得到显著提升。建议定期进行性能审计(至少每季度一次),持续跟踪关键指标变化。