当前位置: 首页 > news >正文

前端架构-CSR、SSR 和 SSG

将从 定义、流程、优缺点和适用场景 四个方面详细说明它们的区别。


一、核心定义

缩写英文中文核心思想
CSRClient-Side Rendering客户端渲染服务器发送一个空的 HTML 壳和 JavaScript bundle,由浏览器下载并执行 JS 来渲染内容。
SSRServer-Side Rendering服务端渲染服务器在每次请求时,动态生成并填充数据的完整 HTML 页面,然后发送给浏览器。
SSGStatic Site Generation静态站点生成项目构建时,就预先生成好完整的、带内容的 HTML 页面。服务器直接返回这些现成的文件。

二、详细流程对比

为了更直观地理解三者的区别,下图展示了从用户请求到页面展示的完整流程差异:

用户/浏览器服务器CDNCSR (Client-Side Rendering)1. 请求 URL2. 返回空HTML框架 + JS链接3. 请求并下载JS bundle白屏等待4. 执行JS,渲染页面并请求数据可能再次等待5. 更新DOM,完全可交互SSR (Server-Side Rendering)1. 请求 URL2. 服务器执行代码动态生成带内容的HTML3. 返回完整内容的HTML显示内容(可阅读)4. 下载并执行JS (Hydration注水)5. 页面完全可交互SSG (Static Site Generation)1. 请求 URL2. 直接返回预先生成的完整HTML文件瞬间显示内容(可阅读)3. 下载并执行JS (Hydration注水)4. 页面完全可交互用户/浏览器服务器CDN

通过上图流程可以清晰地看到:

  • CSR 的“白屏时间”最长,因为需要等待 JS 下载、执行并完成数据抓取后才会渲染内容。
  • SSRSSG 都能快速呈现初始内容,因为它们直接向浏览器提供了完整的 HTML。两者的核心区别在于 HTML 的生成时机:SSR 是“动态生成”,而 SSG 是“预先构建”。

三、优缺点对比

CSRSSRSSG
优点1. 前后端分离,开发模式清晰。
2. 服务器压力小,资源消耗低。
3. 首次加载后,后续页面切换极快(SPA体验)。
1. 首屏加载快,用户体验好。
2. SEO 友好,搜索引擎可直接抓取。
3. 社交分享预览效果好。
1. 性能极致,速度最快(可从CDN分发)。
2. 安全性高,无服务器端逻辑。
3. SEO 友好
4. 部署简单、成本低。
缺点1. 首屏加载慢,白屏时间长。
2. SEO 不友好,爬虫难以抓取。
3. 社交分享预览内容为空。
1. 服务器压力大,每次请求都渲染。
2. 开发复杂度高,需考虑服务端环境。
3. TTI可能较慢,注水完成前无法交互。
1. 不适用于高度动态内容(如 dashboard)。
2. 数据变化需重新构建整个站点。

四、如何选择?适用场景是什么?

  • 选择 CSR 如果

    • 你的应用是后台管理系统、Dashboard 等对 SEO 毫无要求的场景。
    • 你非常看重 SPA 的流畅交互体验,且用户不会频繁刷新页面。
  • 选择 SSR 如果

    • 你的应用是内容型网站(新闻站、博客、电商商品页),SEO 和首屏速度是生命线
    • 你需要为每个用户或每次请求生成个性化内容(如用户仪表盘)。
    • 你愿意承担更高的服务器成本和开发复杂度。(Next.js, Nuxt.js 等框架极大地降低了复杂度)
  • 选择 SSG 如果

    • 你的网站内容主要是静态的,数据不会频繁变更(文档、博客、公司官网、营销落地页)。
    • 你追求极致的性能、安全性和低廉的托管成本
    • 你甚至可以接受在内容更新后等待一段构建时间。(Next.js, Gatsby, VuePress, Hugo 等都是优秀的SSG框架)

现代框架的融合趋势

值得注意的是,像 Next.js 这样的现代框架并不强迫你只选择一种模式,而是支持混合模式(Hybrid)

  • 你可以将大部分页面设置为 SSG(如博客文章、产品页)。
  • 将少数需要服务器渲染的页面设置为 SSR(如用户订单页)。
  • 同时保留 CSR 的交互体验(如网站后台)。

这种“量体裁衣”的方式,让你能为每个页面选择最合适的渲染策略,从而在性能、SEO和开发体验上取得最佳平衡。


文章转载自:

http://ewwpOdo6.qhnmj.cn
http://urBkMKBa.qhnmj.cn
http://XEMjDZrn.qhnmj.cn
http://0xgnb1FT.qhnmj.cn
http://BGMRrvWV.qhnmj.cn
http://ju6pGekg.qhnmj.cn
http://BU5TwPVE.qhnmj.cn
http://VLi46yWh.qhnmj.cn
http://ZaqCIq7T.qhnmj.cn
http://7IWRADrM.qhnmj.cn
http://SNnWs3ho.qhnmj.cn
http://6r1xRlaW.qhnmj.cn
http://tann4W2D.qhnmj.cn
http://rzJPpUfr.qhnmj.cn
http://2oVKyDEj.qhnmj.cn
http://1iDCrHLY.qhnmj.cn
http://5q23Rbsn.qhnmj.cn
http://bjXPutpv.qhnmj.cn
http://iYn1w5wa.qhnmj.cn
http://vsLIQ9DM.qhnmj.cn
http://sNUtTSVg.qhnmj.cn
http://qSHePs6i.qhnmj.cn
http://97Ze9goc.qhnmj.cn
http://DSo2s5E9.qhnmj.cn
http://sYVfIjIJ.qhnmj.cn
http://rWlLxWSD.qhnmj.cn
http://mBkMXOUd.qhnmj.cn
http://ywKGF0hV.qhnmj.cn
http://pc7UCuOc.qhnmj.cn
http://vjZVl2jw.qhnmj.cn
http://www.dtcms.com/a/381065.html

相关文章:

  • range与enumerate的异同与使用
  • Cursor MCP调用流程
  • UBOOT启动流程详解-现代FIT设备加载
  • 中级统计师-统计法规-第七章 统计调查管理
  • 力扣刷题笔记-电话号码的字母组合
  • 基于arduino的视频监控土壤灌溉系统
  • 【硬件-笔试面试题-90】硬件/电子工程师,笔试面试题(知识点:DCDC开关电源的效率计算)
  • 快速理解并记住Python中的可变与不可变对象
  • Netty 调优篇:实战配置、性能监控与常见坑
  • ZYNQ7020+AD9361裸机驱动验证
  • 【超简单】后端入门案例-基于SpringBoot+MyBatis-plus+MySQL图书管理系统
  • 【C++】:list容器全面解析(超详细)
  • Java 笔记 OCA 备考Checked Exception(受检异常)
  • DAY 26 函数专题1:函数定义与参数-2025.9.13
  • MySQL的基础和进阶与运维
  • 看到手就亮灯 防夹手视觉光栅
  • QT M/V架构开发实战:M/V架构的初步认识
  • 4.2-中间件之MySQL
  • 基于hiprint的票据定位打印系统开发实践
  • 批量获取虾皮商品数据:开放API接口操作详解
  • @JsonFormat 如何在get请求中日期字段不报错还能使用
  • C/C++ 标准库中的 `strspn` 函数
  • 关闭click for mouse control
  • C语言打印爱心
  • Notion-Folder-Opener | 一个极简、稳定的本地“链接→打开文件/文件夹”工具
  • Linux系统 SELinux 安全管理与故障排查
  • Vue:后端服务代码解析
  • 仓颉语言与C++对比深度解析:从特性对比到语言选型及实践
  • 嵌入式 - ARM6
  • uniapp | 快速上手ThorUI组件