SSR(Server-Side Rendering)和 SSG(Static Site Generation)是两种不同的前端渲染策略,主要区别在于HTML 生成的时机和方式。以下是它们的核心差异、优缺点及适用场景的对比:

一、核心区别:HTML 生成时机

特性 SSR(服务端渲染) SSG(静态站点生成)
HTML 生成时机 请求时生成:每次用户请求页面时,服务器实时渲染 HTML 并返回。 构建时生成:在项目构建阶段(如打包时)提前生成所有静态 HTML 文件,请求时直接返回预生成的文件。
数据依赖 依赖实时数据:每次渲染时从数据库、API 等获取最新数据。 依赖构建时数据:生成后数据固定,更新需重新构建(除非结合 ISR)。
服务器角色 服务器持续参与渲染过程,需长期运行服务。 服务器仅作为静态文件服务器,无需执行渲染逻辑。
客户端激活 客户端接收到 HTML 后,需执行 JS 代码“激活”页面(Hydration)。 同样需要客户端 JS 激活交互,但无需等待数据获取(数据已嵌入 HTML)。

二、性能与体验对比

维度 SSR SSG
首屏加载速度(FCP) 较快:服务器直接返回渲染好的 HTML,但需等待数据请求。 极快:直接返回预生成的 HTML,无需等待服务器渲染。
整体交互响应 首次加载后,客户端已激活,后续交互流畅。 首次加载后,客户端已激活,后续交互流畅。
服务器压力 高:每次请求都需服务器计算渲染,并发量大时易成为瓶颈。 低:只需返回静态文件,几乎无计算压力,可轻松应对高并发。
缓存策略 需手动实现缓存(如 Redis 缓存渲染结果)。 天然支持 CDN 缓存,静态文件可长期缓存,降低服务器负载。

三、优缺点与适用场景

1. SSR 的优缺点

  • 优点
    • 实时数据:每次请求都能获取最新数据(如用户个人信息、实时评论)。
    • SEO 友好:搜索引擎可直接抓取渲染后的 HTML。
    • 动态内容:适合频繁更新的页面(如电商商品详情页、社交媒体动态)。
  • 缺点
    • 服务器成本高:需维护长期运行的服务器,并发量大时需扩容。
    • 首屏速度依赖网络:用户需等待服务器渲染和数据请求。
  • 适用场景
    • 数据实时性要求高的页面(如 Dashboard、用户中心)。
    • 需要 SEO 但内容频繁更新的页面(如新闻详情页)。
    • 用户交互复杂、依赖服务端状态的应用(如在线游戏、协作工具)。

2. SSG 的优缺点

  • 优点
    • 极致性能:静态文件可缓存到 CDN,全球用户访问速度快。
    • 低成本:无需长期运行服务器,可部署到静态文件托管平台(如 Vercel、Netlify)。
    • 高并发:轻松应对百万级流量(如营销活动页、博客)。
  • 缺点
    • 数据时效性差:内容更新需重新构建部署。
    • 动态内容支持有限:不适合实时变化的内容(除非结合 ISR)。
  • 适用场景
    • 内容静态或更新频率低的页面(如博客、文档网站、企业官网)。
    • 需要 SEO 但数据变化少的页面(如产品介绍页、帮助中心)。
    • 需快速部署和扩展的应用(如活动页、临时网站)。

四、技术实现对比

技术栈 SSR 实现方式 SSG 实现方式
React Next.js(getServerSideProps Next.js(getStaticPaths + getStaticProps
Gatsby
Vue Nuxt.js(asyncData/fetch Nuxt.js(静态生成模式)
Angular Angular Universal Angular CLI(ng build --ssr + 预渲染)
静态站点生成器 不适用 Jekyll(Ruby)、Hugo(Go)、Hexo(Node.js)

五、混合方案:ISR(增量静态再生)

为弥补 SSG 数据时效性差的问题,部分框架(如 Next.js、Nuxt.js)支持 ISR(Incremental Static Regeneration)

  • 原理:在构建时生成静态 HTML,后续通过后台定时或触发机制重新生成部分页面,无需全量重建。
  • 适用场景:适合数据定期更新但无需实时的场景(如电商商品列表、新闻聚合页)。
  • 示例(Next.js)

    export async function getStaticProps() {
    const res = await fetch('https://api.example.com/products');
    const products = await res.json();
    
    return {
      props: { products },
      revalidate: 60 * 60, // 每小时重新生成一次
    };
    }

六、如何选择?

根据以下因素决策:

  1. 数据更新频率

    • 实时更新 → SSR
    • 很少更新 → SSG
    • 定期更新 → SSG + ISR
  2. SEO 需求

    • 强需求 → SSR 或 SSG(优先 SSG,性能更佳)
    • 无需求 → CSR(客户端渲染)或 SSR
  3. 服务器成本

    • 预算有限 → SSG
    • 预算充足 → SSR
  4. 用户体验

    • 极致首屏速度 → SSG
    • 动态交互为主 → SSR
  5. 开发复杂度

    • 简单 → SSG
    • 复杂(如依赖服务端状态) → SSR

七、总结

方案 生成时机 数据特性 性能 成本 开发难度 典型场景
SSR 请求时 实时数据 实时 Dashboard、用户中心
SSG 构建时 静态数据 极高 极低 博客、企业官网、文档
ISR 构建时 + 增量更新 定期更新数据 电商商品页、新闻列表

实际项目中,也可根据页面特性混合使用(如首页 SSG + 详情页 SSR),最大化性能与灵活性。