单页应用如何提高加载速度

通过代码分割、缓存、预加载等技术优化 SPA 加载性能

问题

单页应用(SPA)首次加载时往往需要下载大量 JavaScript 和资源文件,如何优化加载速度?

解答

代码分割与懒加载

将应用代码拆分成多个小块,按需加载,避免一次性加载所有代码。

// React 示例
import { lazy, Suspense } from 'react';

const Dashboard = lazy(() => import('./Dashboard'));
const Profile = lazy(() => import('./Profile'));

function App() {
  return (
    <Suspense fallback={<div>Loading...</div>}>
      <Routes>
        <Route path="/dashboard" element={<Dashboard />} />
        <Route path="/profile" element={<Profile />} />
      </Routes>
    </Suspense>
  );
}

资源缓存

配置合理的缓存策略,让浏览器缓存静态资源。

// webpack 配置示例
module.exports = {
  output: {
    filename: '[name].[contenthash].js',
    clean: true
  }
};
# Nginx 缓存配置
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
  expires 1y;
  add_header Cache-Control "public, immutable";
}

预加载关键资源

使用 preloadprefetch 提前加载关键资源。

<!-- 预加载关键 CSS 和字体 -->
<link rel="preload" href="/main.css" as="style">
<link rel="preload" href="/font.woff2" as="font" crossorigin>

<!-- 预获取可能需要的资源 -->
<link rel="prefetch" href="/dashboard.js">

图片优化

选择合适的图片格式并压缩,使用现代格式如 WebP。

<picture>
  <source srcset="image.webp" type="image/webp">
  <source srcset="image.jpg" type="image/jpeg">
  <img src="image.jpg" alt="description">
</picture>

启用压缩

在服务器端启用 Gzip 或 Brotli 压缩。

// Express 示例
const compression = require('compression');
app.use(compression());

使用 CDN

将静态资源部署到 CDN,加速全球访问。

// webpack 配置
module.exports = {
  output: {
    publicPath: 'https://cdn.example.com/'
  }
};

优化 API 请求

减少请求数量,合并接口,使用缓存。

// 使用 SWR 缓存请求
import useSWR from 'swr';

function Profile() {
  const { data } = useSWR('/api/user', fetcher, {
    revalidateOnFocus: false,
    dedupingInterval: 60000
  });
  
  return <div>{data?.name}</div>;
}

服务器端渲染(SSR)

使用 SSR 生成首屏 HTML,减少客户端渲染时间。

// Next.js 示例
export async function getServerSideProps() {
  const data = await fetchData();
  return { props: { data } };
}

关键点

  • 代码分割和路由懒加载可显著减少首次加载体积
  • 合理配置缓存策略(contenthash + 长期缓存)提升二次访问速度
  • 使用 preload 预加载关键资源,prefetch 预获取次要资源
  • 图片使用 WebP 等现代格式,启用服务器压缩(Gzip/Brotli)
  • CDN 加速静态资源分发,SSR 优化首屏渲染时间