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, // 每小时重新生成一次 }; }
六、如何选择?
根据以下因素决策:
-
数据更新频率:
- 实时更新 → SSR
- 很少更新 → SSG
- 定期更新 → SSG + ISR
-
SEO 需求:
- 强需求 → SSR 或 SSG(优先 SSG,性能更佳)
- 无需求 → CSR(客户端渲染)或 SSR
-
服务器成本:
- 预算有限 → SSG
- 预算充足 → SSR
-
用户体验:
- 极致首屏速度 → SSG
- 动态交互为主 → SSR
-
开发复杂度:
- 简单 → SSG
- 复杂(如依赖服务端状态) → SSR
七、总结
方案 | 生成时机 | 数据特性 | 性能 | 成本 | 开发难度 | 典型场景 |
---|---|---|---|---|---|---|
SSR | 请求时 | 实时数据 | 中 | 高 | 高 | 实时 Dashboard、用户中心 |
SSG | 构建时 | 静态数据 | 极高 | 极低 | 低 | 博客、企业官网、文档 |
ISR | 构建时 + 增量更新 | 定期更新数据 | 高 | 低 | 中 | 电商商品页、新闻列表 |
实际项目中,也可根据页面特性混合使用(如首页 SSG + 详情页 SSR),最大化性能与灵活性。