创见博客
基于React的SSR应用和纯CSR应用有什么区别
七崽爱吃小饼干2026/01/09阅读 5专栏 React

React SSR 服务端渲染 vs 纯 CSR 客户端渲染 核心区别

前置核心概念

纯 CSR (Client Side Rendering) 客户端渲染

标准的React单页应用(SPA)就是纯CSR:页面的所有渲染工作、数据请求、DOM构建,全部在浏览器(客户端) 中完成,服务端只负责返回「空壳HTML」和JS静态资源。

SSR (Server Side Rendering) 服务端渲染

React的SSR不是「只有服务端渲染」,而是 「服务端首屏渲染 + 客户端水合激活」的两段式渲染,核心是「首屏的组件→HTML的转换工作放到Node服务端完成」,后续的交互/页面更新依然是客户端行为,这是你上一轮问的「水合」的核心前置逻辑。


一、核心本质区别

纯CSR:浏览器从头构建一切

服务端只返回一个只有根容器的空HTML文件(<div id="root"></div>),浏览器拿到后,加载React的JS包 → 执行JS代码 → 请求接口数据 → React构建虚拟DOM → 生成真实DOM → 挂载到root节点,页面所有内容都是浏览器「从零绘制」出来的。

React SSR:服务端绘骨架,客户端赋灵魂

服务端提前把React组件渲染成带完整内容的HTML字符串(有文本、有DOM结构)返回给浏览器,浏览器拿到后「瞬间展示内容」;同时加载JS包,执行水合(Hydration) 操作 → 复用服务端生成的DOM节点 → 构建虚拟DOM/组件实例 → 绑定事件/初始化状态,静态HTML变成可交互的React应用。

形象比喻:

  • CSR:给你一张白纸+画笔,让你自己在浏览器里画完一整幅画;
  • SSR:服务端先帮你画好画的「完整黑白轮廓」,你拿到后只需要上色、裱框(水合),就完成了成品画。

二、完整渲染流程对比

纯CSR 客户端渲染 完整流程(共6步,全部在浏览器执行)

  1. 浏览器发起页面请求 → 服务端返回 空壳HTML文件(只有<div id="root"></div>)+ JS/CSS资源链接;
  2. 浏览器解析空HTML,看到root容器,但页面是空白的(白屏);
  3. 浏览器下载React核心包、业务组件JS、路由、状态管理等所有JS资源;
  4. JS加载完成后,在浏览器执行:React初始化,发送数据请求(ajax/fetch) 获取页面所需数据;
  5. React执行组件渲染:从根组件开始,生成虚拟DOM树 → 转换成真实DOM节点;
  6. 把生成的真实DOM挂载到root容器中,页面终于展示内容,同时自动绑定事件,页面可交互。

React SSR 服务端渲染 完整流程(分「服务端阶段+客户端阶段」共8步,核心拆分)

阶段一:服务端侧执行(核心:产出「带内容的静态HTML」,解决白屏/SEO)

  1. 浏览器发起页面请求 → Node服务端接收到请求;
  2. 服务端主动发起数据请求(接口/数据库查询),获取当前页面所需的完整数据;
  3. 服务端调用React的服务端API(renderToString/renderToPipeableStream),将「根组件+页面数据」渲染成 完整的HTML字符串(有DOM结构、有文本内容、有样式);
  4. 服务端把HTML字符串嵌入到标准HTML骨架中,返回给浏览器。

阶段二:客户端侧执行

  1. 浏览器解析服务端返回的HTML,立即展示完整页面内容(无白屏,用户能看到东西);
  2. 浏览器并行下载React客户端JS包(组件、路由、事件处理等);
  3. JS加载完成后,执行 水合(Hydrate) 操作:React复用已有的真实DOM节点,快速构建虚拟DOM树+组件实例,绑定所有事件、初始化state/props;
  4. 水合完成,页面从「静态HTML」变成可交互的动态React应用,后续操作和纯CSR完全一致。

三、核心优缺点全方位对比

维度1:页面加载体验 & 首屏速度(核心差异1,天壤之别)

✔ 纯CSR:首屏加载慢,必有白屏期

  • 缺点:浏览器要等「空HTML+完整JS包+数据请求」全部完成,才能渲染内容,白屏时间长(JS包越大、网速越慢,白屏越明显);
  • 优点:首屏之后的路由切换极快(SPA核心优势),因为只是客户端切换组件,不用请求服务端,也不用重新加载JS,只有数据请求,体验丝滑。

✔ React SSR:首屏加载极快,无白屏,用户感知极佳

  • 优点:浏览器拿到HTML就立即展示内容,白屏时间几乎为0,哪怕JS还在加载,用户也能看到页面完整内容,「感知加载速度」远快于CSR;
  • 优点:首屏之后的路由切换,和CSR完全一致,依然是客户端渲染,速度丝滑;
  • 小缺点:服务端需要额外处理渲染和数据请求,服务端有一定性能开销(可通过缓存优化)。

维度2:SEO 搜索引擎优化(核心差异2,决定业务选型的关键)

✔ 纯CSR:SEO 极差,几乎无效

  • 致命缺点:搜索引擎的爬虫程序,在爬取页面时,只会请求并解析HTML文件,不会执行页面中的JS代码;
  • 结果:爬虫拿到的永远是「只有root容器的空HTML」,页面的真实内容、文案、图片都爬取不到,搜索引擎无法收录页面内容,网站在百度/谷歌上几乎没有排名;
  • 补充:这是所有纯SPA应用的通病,也是React/Vue项目做SSR的第一大核心原因。

✔ React SSR:SEO 完美友好,爬虫友好

  • 核心优点:服务端返回的是带完整内容的HTML字符串,搜索引擎爬虫可以直接读取到页面的所有文本、图片、链接等核心内容,能正常解析、正常收录、正常排名;
  • 结论:只要你的业务需要SEO(官网、博客、商城、资讯类网站),就必须用SSR,CSR完全满足不了。

维度3:交互能力 & 功能完整性(无差异,最终一致)

✔ 纯CSR:原生支持完整交互

  • 页面渲染完成的那一刻,就自带所有React的交互能力:事件绑定(onClick/onChange)、状态更新、组件通信、路由跳转等,因为DOM和组件实例都是浏览器从头构建的,天然完整。

✔ React SSR:水合后交互能力完全一致

  • 服务端返回的HTML是「静态无交互」的,但水合完成后,页面会被激活,拥有和纯CSR完全一致的交互能力、状态管理、更新机制;
  • 补充:水合的过程是「静默执行」的,用户几乎感知不到,只会觉得「页面加载完就能点」,体验极佳。

维度4:构建复杂度 & 开发成本(核心差异3,开发层面)

✔ 纯CSR:极简,开发成本极低,入门友好

  • 优点:项目搭建简单,用create-react-app一键生成,无需配置Node服务端,无需处理服务端渲染逻辑,所有代码都在浏览器执行,调试简单;
  • 优点:无跨端兼容问题,所有React语法/钩子都能正常使用,不用考虑「服务端和客户端的差异」;
  • 结论:90%的后台管理系统、内部系统、不需要SEO的业务,都用纯CSR,性价比最高。

✔ React SSR:复杂度高,开发成本更高,有学习门槛

  • 缺点:项目架构复杂,需要搭建Node.js服务端,需要区分「服务端代码」和「客户端代码」,需要处理「服务端数据请求」「服务端路由匹配」;
  • 缺点:有同构问题(最坑的点):部分浏览器API(window/document/localStorage)在服务端不存在,直接使用会报错,需要做兼容处理;部分React钩子(比如useEffect)只在客户端执行,服务端不执行;
  • 优点:有成熟的框架封装(Next.js/Remix),不用自己从零搭建SSR架构,开箱即用,大幅降低开发成本;
  • 结论:有SEO需求的业务,必须承担这个复杂度,这是必要成本。

维度5:性能开销 & 部署运维(各有优劣)

✔ 纯CSR:

  • 优点:服务端无任何渲染开销,服务端只是静态资源服务器(返回HTML/JS/CSS),部署简单,成本极低,随便一个静态托管平台(阿里云OSS、Netlify、GitHub Pages)都能部署;
  • 缺点:浏览器性能开销大,所有渲染、数据处理都在浏览器执行,低端机型可能会卡顿。

✔ React SSR:

  • 缺点:服务端有渲染开销,每个页面请求都需要服务端执行React组件渲染+数据请求,高并发场景下需要做缓存/集群,部署时需要同时部署Node服务端和静态资源,运维成本更高;
  • 优点:浏览器性能开销小,服务端分担了首屏渲染的压力,水合的开销远小于从头构建DOM的开销,低端机型体验更好。

维度6:首屏数据请求(核心差异4,数据请求的执行端)

✔ 纯CSR:数据请求在浏览器执行

  • 流程:浏览器加载完JS → React组件挂载(useEffect)→ 发送ajax请求获取数据 → 拿到数据后更新组件、渲染内容;
  • 问题:数据请求是「渲染后的步骤」,所以白屏时间 = JS加载时间 + 数据请求时间,双重等待。

✔ React SSR:数据请求在服务端执行

  • 流程:服务端接收到请求 → 先请求数据 → 拿到数据后渲染组件 → 返回带数据的HTML;
  • 优势:数据请求和渲染都在服务端完成,服务端请求接口的速度远快于浏览器(内网请求),浏览器拿到的是「数据+内容」的成品HTML,无需等待浏览器端的数据请求。

四、补充:两者的「虚拟DOM/组件实例」差异

这是你上一轮问「为什么需要水合」的延伸,也是理解两者差异的底层逻辑,必须补充:

纯CSR:虚拟DOM+组件实例「浏览器全新构建」

  • React在浏览器执行时,从0开始生成虚拟DOM树,然后转换成真实DOM树,同时创建所有组件的实例,绑定事件、初始化状态;
  • 整个过程是「无复用」的,所有内容都是全新构建,所以耗时更长,白屏更明显。

React SSR:虚拟DOM+组件实例「水合复用构建」

  • 服务端只生成真实DOM,没有虚拟DOM和组件实例;
  • 客户端水合的核心:复用服务端生成的真实DOM,快速构建对应的虚拟DOM树和组件实例,绑定事件;
  • 核心价值:复用DOM避免了「重复渲染」,没有页面闪烁,性能远高于CSR的全新构建,这也是SSR首屏快的核心原因之一。

再次强调:水合是SSR独有的概念,CSR中不存在水合,因为CSR没有服务端生成的DOM可以复用。


五、关键补充:两者的「同构/非同构」概念

纯CSR:非同构应用

所有代码只在「客户端」执行,没有服务端执行的React代码,前后端代码完全分离,不存在「同构」问题。

React SSR:同构应用 (Isomorphic React)

核心定义:一套React组件代码,既能在服务端执行(用于首屏渲染HTML),又能在客户端执行(用于水合激活和后续更新),这就是「同构」。

  • 优点:代码复用率极高,不用为服务端和客户端写两套组件;
  • 痛点:需要处理「同构兼容」,比如避免在服务端使用window/document,用useEffect包裹客户端专属逻辑等。

六、选型建议:什么时候用CSR?什么时候用SSR?

✔ 优先选【纯CSR客户端渲染】的场景(90%的业务)

  • 后台管理系统(OA/CRM/ERP)、内部业务系统;
  • 不需要SEO的前台业务(比如社交APP的网页版、小游戏、工具类应用);
  • 追求开发效率、快速上线,团队没有Node.js服务端开发经验;
  • 对首屏速度要求不高,更看重路由切换的流畅性。

✔ 必须选【React SSR服务端渲染】的场景(10%的业务,但刚需)

  • 有强SEO需求的业务:企业官网、博客、资讯平台、电商商城、自媒体网站;
  • 对首屏加载速度要求极高的业务:比如金融、电商首页,用户对加载速度敏感,白屏会导致流失;
  • 面向公域流量的C端产品,需要靠搜索引擎引流的业务。

补充:React的SSR不用自己从零搭建,Next.js 是React官方推荐的SSR/同构框架,开箱即用,完美封装了SSR的所有细节,是现在React SSR的首选方案。


全文核心总结

核心差异(3句话说透)

  1. 渲染位置不同:CSR所有渲染在浏览器,SSR首屏渲染在服务端,后续更新在浏览器;
  2. 核心痛点不同:CSR的痛点是首屏慢、SEO差,SSR的痛点是架构复杂、开发成本高;
  3. 核心优势互补:CSR胜在开发简单、体验丝滑,SSR胜在首屏快、SEO友好。

核心结论

  1. React SSR 不是为了「替代」CSR,而是为了「弥补」CSR的两大致命缺陷(首屏慢、SEO差);
  2. 两者没有绝对的好坏,只有「是否适合业务场景」,选择的核心是:是否需要SEO,是否看重首屏速度;
  3. 所有React SSR应用,最终都会「降级」为CSR应用,因为水合完成后,后续的操作和CSR完全一致。
评论
0/100