Skip to content

服务端渲染(SSR)与客户端渲染(CSR)

一、传统服务端渲染(SSR)

原理

  1. 流程

    • 客户端发送 HTTP 请求。
    • 服务端通过模板引擎(如 EJS、JSP)拼接数据与 DOM,生成完整 HTML。
    • 服务端返回静态 HTML,客户端直接渲染。
  2. 技术代表:ASP、JSP、PHP、EJS。

优点

  • 首屏速度快:无需等待 JS 加载,直接显示内容。
  • SEO 友好:搜索引擎可直接抓取完整 HTML。
  • 服务端压力小:渲染由服务端完成,客户端仅展示。

缺点

  • 维护困难:前后端逻辑耦合,代码复用性低。
  • 用户体验差:页面跳转需重新加载,交互不流畅。
  • 开发效率低:前后端分离不彻底,协作成本高。

二、现代服务端渲染(同构渲染)

核心概念

  • 同构:同一套代码在服务端(Node.js)和客户端运行,实现“预渲染+注水化”。
  • 技术代表:Vue SSR(Nuxt.js)、React SSR(Next.js)。

原理

  1. 流程

    • 客户端发起请求。
    • 服务端运行 Vue/React 应用,生成虚拟 DOM 并转为 HTML 字符串。
    • 服务端返回 HTML,客户端激活 JS 后绑定事件(注水化)。
  2. 关键点

    • 预渲染:服务端生成首屏 HTML,解决首屏白屏问题。
    • 注水化:客户端接管交互逻辑,实现动态更新。

优点

  • 首屏优化:首屏内容由服务端快速生成,无需等待 JS。
  • SEO 友好:搜索引擎可抓取预渲染的 HTML。
  • 代码复用:前后端共享组件和逻辑,降低维护成本。
  • 框架支持:Nuxt.js(Vue)、Next.js(React)提供开箱即用方案。

缺点

  • 服务端压力:需 Node.js 服务支撑,高并发下资源消耗大。
  • 复杂度:需处理服务端与客户端的生命周期差异。
  • 第三方库适配:部分库可能依赖浏览器 API,需特殊处理。

三、客户端渲染(CSR)

原理

  1. 流程

    • 客户端发起请求。
    • 服务端返回空 HTML + JS 文件。
    • 客户端加载 JS,通过 Ajax 请求数据,动态渲染 DOM。
  2. 技术代表:Vue、React、Angular(SPA 模式)。

优点

  • 交互流畅:页面跳转无刷新,用户体验接近原生应用。
  • 前后端分离彻底:服务端仅提供 API,开发效率高。
  • 动态更新:适合高频数据交互的场景(如社交、管理后台)。

缺点

  • 首屏慢:需加载 JS 并请求数据,用户可能看到白屏。
  • SEO 困难:搜索引擎难以抓取 JS 生成的内容。
  • 依赖前端性能:低端设备可能卡顿。

四、对比与选型建议

维度传统 SSR现代 SSR(同构)CSR
首屏速度
SEO友好友好不友好
开发效率低(前后端耦合)中(需 Node.js)高(前后端完全分离)
维护成本
适用场景官网、电商列表页需要 SEO 的首屏、内容型网站管理后台、社交应用

优化方向

  • CSR 优化

    • 代码分割:按路由/组件拆分 JS,减少首屏加载量。
    • 预加载:利用<link rel="preload">提前加载关键资源。
    • 骨架屏:首屏加载时显示占位内容,提升感知速度。
    • 服务端渲染混合:对关键页面采用 SSR,其他页面 CSR。
  • 现代 SSR 优化

    • 缓存:对不常变更的页面缓存 HTML,减少服务端渲染耗时。
    • 流式渲染:分块传输 HTML,优先显示首屏内容。
    • Node.js 集群:通过集群部署提升并发能力。

五、总结

  • 优先选 CSR:若项目注重交互体验、无需 SEO(如内部系统),或首屏内容可通过懒加载优化。
  • 优先选现代 SSR:若需兼顾 SEO 与动态交互(如电商、新闻网站),且能接受服务端复杂度。
  • 传统 SSR:仅在 legacy 系统维护时使用,新项目建议直接采用现代 SSR 框架(如 Nuxt.js/Next.js)。