Skip to content
On this page

性能优化最佳实践

性能优化是一个持续的过程,需要从多个维度综合考虑。本章总结了在Web开发中实施性能优化的最佳实践。

综合优化策略

性能优化清单

在项目开发过程中,遵循以下性能优化清单:

网络层面

  • 启用Gzip/Brotli压缩
  • 使用CDN加速静态资源
  • 实现资源预加载和预获取
  • 优化HTTP缓存策略
  • 启用HTTP/2

资源层面

  • 压缩和优化图片
  • 压缩CSS、JavaScript文件
  • 消除未使用的代码
  • 实现代码分割
  • 使用WebP格式图片

渲染层面

  • 减少关键渲染路径长度
  • 优化CSS和JavaScript加载顺序
  • 避免强制同步布局
  • 使用高效的动画技术
  • 优化DOM操作

性能预算

建立性能预算以控制性能指标:

javascript
// webpack性能预算配置
module.exports = {
  performance: {
    maxAssetSize: 250000, // 单个资源最大250KB
    maxEntrypointSize: 250000, // 入口文件最大250KB
    hints: 'warning'
  }
};

前端优化

JavaScript优化

代码分割

javascript
// 使用动态导入实现代码分割
const loadFeature = async () => {
  const { expensiveFeature } = await import('./expensive-feature');
  return expensiveFeature();
};

// 按路由分割
const HomePage = lazy(() => import('./HomePage'));
const AboutPage = lazy(() => import('./AboutPage'));

懒加载

javascript
// 图片懒加载
const LazyImage = ({ src, alt }) => {
  return (
    <img 
      src="placeholder.jpg" 
      data-src={src} 
      alt={alt}
      className="lazy-image"
    />
  );
};

CSS优化

关键CSS内联

html
<!DOCTYPE html>
<html>
<head>
  <!-- 内联关键CSS -->
  <style>
    .header { height: 60px; background: #fff; }
    .hero { min-height: 300px; }
  </style>
  
  <!-- 非关键CSS异步加载 -->
  <link rel="preload" href="non-critical.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
</head>

后端优化

服务端渲染 (SSR)

使用SSR提升首屏加载速度:

javascript
// Node.js SSR示例
app.get('*', (req, res) => {
  const html = ReactDOMServer.renderToString(<App />);
  res.send(`
    <!DOCTYPE html>
    <html>
      <body>
        <div id="root">${html}</div>
        <script src="client.js"></script>
      </body>
    </html>
  `);
});

API优化

  • 实现API缓存策略
  • 使用GraphQL减少数据传输
  • 实现分页和懒加载
  • 压缩API响应

监控和度量

性能监控

javascript
// 监控核心Web指标
import { getCLS, getFID, getFCP, getLCP, getTTFB } from 'web-vitals';

const storeMetrics = (metric) => {
  // 发送指标到分析服务
  analytics.track('Web Vitals', metric);
};

getCLS(storeMetrics);
getFID(storeMetrics);
getFCP(storeMetrics);
getLCP(storeMetrics);
getTTFB(storeMetrics);

性能审计

定期执行性能审计:

javascript
// Lighthouse CI配置
module.exports = {
  ci: {
    collect: {
      url: ['https://example.com'],
      numberOfRuns: 3,
    },
    assert: {
      assertions: {
        'categories:performance': ['warn', { minScore: 0.9 }],
        'categories:accessibility': ['warn', { minScore: 0.9 }],
      },
    },
  },
};

用户体验优化

感知性能

提升用户感知的性能:

css
/* 使用骨架屏 */
.skeleton {
  background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
  background-size: 200% 100%;
  animation: loading 1.5s infinite;
}

@keyframes loading {
  0% { background-position: 200% 0; }
  100% { background-position: -200% 0; }
}

预测加载

javascript
// 根据用户行为预测加载
let isLikelyToNavigate = false;

// 检测用户悬停在链接上超过1秒
document.addEventListener('mouseover', (e) => {
  if (e.target.tagName === 'A') {
    setTimeout(() => {
      if (e.target === document.activeElement || /* still hovered */) {
        isLikelyToNavigate = true;
        preloadResource(e.target.href);
      }
    }, 1000);
  }
});

工具和流程

构建优化

javascript
// Webpack优化配置
module.exports = {
  optimization: {
    splitChunks: {
      chunks: 'all',
      cacheGroups: {
        vendor: {
          test: /[\\/]node_modules[\\/]/,
          name: 'vendors',
          chunks: 'all',
        }
      }
    }
  }
};

持续集成

在CI流程中集成性能检查:

yaml
# GitHub Actions性能检查
name: Performance Check
on: [push, pull_request]
jobs:
  performance:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Setup Node.js
        uses: actions/setup-node@v2
        with:
          node-version: '14'
      - name: Run Lighthouse
        run: |
          npm install -g @lhci/cli
          lhci autorun

团队协作

性能文化

  • 将性能视为功能需求
  • 建立性能指标责任制度
  • 定期进行性能培训
  • 分享性能优化案例

持续改进

性能债务管理

  • 定期重构性能不佳的代码
  • 跟踪性能回归
  • 设定可量化的目标
  • 评估新技术的性能影响

性能优化是一个持续的过程,需要在整个开发生命周期中不断关注和改进。