面向 SEO 的 Web 性能优化:服务端渲染 vs 静态生成

服务端渲染(Server-Side Rendering, SSR)静态站点生成(Static Site Generation, SSG) 之间做出选择,会对 Web 性能和 SEO 产生重大影响。本指南对比了这两种方案,并为每种方案提供了优化策略。

渲染谱系

现代 Web 框架提供了多种渲染策略:

  1. 静态站点生成(SSG):在构建时预先生成
  2. 增量静态再生(Incremental Static Regeneration, ISR):静态生成并定期更新
  3. 服务端渲染(SSR):在每次请求时生成
  4. 客户端渲染(Client-Side Rendering, CSR):在浏览器中渲染
  5. 按需重新验证(On-Demand Revalidation):混合方案

SSG:性能与 SEO 的最佳选择

优势

理想适用场景

SSG 实现(Next.js)

export async function getStaticProps() {
  const posts = await fetchPosts();
  return {
    props: { posts },
    revalidate: 3600, // ISR: regenerate every hour
  };
}

SSR:当动态内容必不可少时

优势

SEO 方面的挑战

SSR 优化

// Cache SSR responses at edge
export async function getServerSideProps({ res }) {
  const data = await fetchData();
  res.setHeader('Cache-Control', 'public, s-maxage=60, stale-while-revalidate=300');
  return { props: { data } };
}

混合渲染策略

最佳方案是将多种渲染方法组合使用:

页面类型 渲染方式 缓存
首页 ISR 5 分钟
博客文章 SSG 1 小时重新验证
产品页面 ISR 15 分钟重新验证
用户仪表盘 SSR 不缓存
搜索结果 SSR 1 分钟缓存
API 路由 SSR 动态

各策略的性能优化

SSG 优化

SSR 优化

流式 SSR

// React 18 streaming SSR
import { renderToPipeableStream } from 'react-dom/server';

app.get('/', (req, res) => {
  const stream = renderToPipeableStream(
    <App />,
    {
      bootstrapScripts: ['/client.js'],
      onShellReady() {
        res.setHeader('content-type', 'text/html');
        stream.pipe(res);
      }
    }
  );
});

对 Core Web Vitals 的影响

指标 SSG SSR CSR
LCP 最佳 良好 较差
FCP 最佳 良好 较差
INP 相同 相同 较差
CLS 良好 良好 不稳定
TTFB 最佳 不稳定 不适用

抓取预算的考量

SSR 站点会消耗更多抓取预算:

SSG 站点对爬虫更友好: