Next.js第十一章(渲染基础概念)

渲染基础

本章我们学习 CSR SSR SSG 三种渲染方式,以及Hydration水合的概念。

CSR

CSR是Client Side Rendering的缩写,即客户端渲染。像我们使用的Vue React Angular 等框架,都是CSR。

工作流程如下:

浏览器请求服务器 -> 服务器返回HTML/JS/CSS等文件 -> JS动态渲染生成DOM -> 浏览器渲染DOM

graph TD A[浏览器发起请求] --> B[服务器返回<br/>空 HTML 骨架 + JS/CSS] B --> C[浏览器下载并解析 JS/CSS] C --> D[JS 动态调用 API 获取数据] D --> E[JS 生成 DOM 结构动态渲染] E --> F[浏览器渲染 DOM] F --> G[页面展示并可交互 无单独水合步骤]

优点:

  • 交互流畅,可直接响应
  • 前后端分离,前端注重UI,后端注重数据

缺点:

  • 首屏加载慢,因为需要下载JS/CSS等文件
  • SEO不友好,因为JS动态渲染(现在爬虫普遍已经支持JS抓取了)

适合场景:

  • 后台管理系统开发(后台系统不需要SEO,也不需要首屏加载速度)
  • 单页面应用开发(SPA)

SSR

SSR是Server Side Rendering的缩写,即服务端渲染。像我们使用的Next.js Nuxt.js等框架,都是SSR。

例如我们有一个电商网站,需要保证用户搜索关键词能搜到 xx商品, 还要注意 用户还可能是弱网环境,在地铁 电梯等,所以我们可以直接把API放到服务器请求,然后渲染成HTML页面返回给浏览器。

工作流程如下:

浏览器请求服务器 -> 服务器(内部调用API接口-> 渲染HTML页面) -> 浏览器直接读取HTML页面 并且 同时加载JS/CSS等文件 -> 执行hydration(水合)

graph TD A[浏览器发起请求] --> B[应用服务器接收请求] B --> C[服务器内部调用 API 获取数据] C --> D[服务器渲染完整 HTML 含数据] D --> E[服务器返回 HTML + JS/CSS] E --> F[浏览器展示 HTML 快速可见] F --> G[加载 JS/CSS] G --> H[执行 Hydration 水合] H --> I[页面激活为可交互状态]

优点:

  • 首屏加载快,因为服务器已经渲染了HTML页面
  • SEO友好,搜索引擎能爬取到完整内容

缺点:

  • 开发成本高,需要懂服务端知识,全栈开发。
  • 服务器承担渲染工作,如果用户访问量大,对服务器配置要求高,增大成本

适合场景:

  • 电商网站开发
  • 博客网站开发
  • 官网/首页等

SSG

SSG是Static Site Generation的缩写,即静态站点生成。像我们使用的Vitepress Astro等框架,都是SSG。

例如我们需要一个查看文档的网站,例如Vue React 等文档,大家看到的都是一样的,所以我们在构建的时候,直接编译成静态文件,连接口都不用请求了,如果在部署CDN/Nginx等服务器,基本可以实现秒开。

工作流程如下:

项目构建 npm run build -> 生成静态文件(每个路由对应一个 HTML) -> 部署到CDN/Nginx等服务器 -> 浏览器请求服务器 -> 服务器返回HTML页面 -> hydration

graph TD A[本地构建] -->|npm run build| B[生成静态文件 每个路由对应 HTML] B --> C[部署到 CDN/Nginx] C --> D[浏览器发起请求] D --> E[CDN/Nginx 返回静态 HTML] E --> F[浏览器展示 HTML 瞬间可见] F --> G[加载 JS/CSS] G --> H[执行 Hydration 水合] H --> I[页面激活为可交互状态]

优点:

  • 首屏加载极快(CDN 分发静态文件,无需服务器实时渲染)
  • 服务器压力小(CDN 直接承载请求,无需服务器执行 JS)
  • SEO 最优(静态 HTML 含完整数据,搜索引擎爬取无压力)

缺点:

  • 不适用于动态数据(数据更新需要重新构建部署,如实时股价、实时评论)
  • 详情页面如果过多(构建时间会长)

适合场景:

  • 技术文档
  • 静态营销页
  • 静态新闻站

Hydration(水合)

简单来说就是HTML他是静态的,需要通过JS才能变成动态的,不然HTML是没有任何交互效果的,当JS下载完成在赋予HTML交互效果的阶段称之为水合。

以Next.js水合为例(详细版本):

服务端操作:

  • Next.js 服务器接收到用户请求。
  • 服务器执行 React 组件代码,获取数据(比如从 API 接口请求文章列表)。
  • 服务器将 React 组件渲染成静态 HTML 字符串(包含了文章列表的所有内容)。
  • 服务器将这个 HTML 字符串返回给浏览器。

客户端操作:

  • 浏览器接收到 HTML,立即解析并展示给用户(此时用户能看到文章列表,但点击 "查看详情" 按钮没有反应)
  • 浏览器开始下载页面所需的 JS 文件(包括 React 核心库、组件代码等)
  • JS 下载完成后,React 会执行 ReactDOM.hydrateRoot() 方法(在 React 18+ 中)
  • hydrateRoot() 会对比浏览器中的真实 DOM 和 React 组件的虚拟 DOM:
    • 如果结构一致,React 会给真实 DOM 绑定事件监听器。
    • 如果发现差异(比如服务器和客户端数据不一致),React 会发出警告,并以客户端渲染的结果为准。
  • 水合完成后,页面变成可交互的动态页面(用户可以点击按钮、滚动加载更多内容等)
相关推荐
西安小哥6 分钟前
端侧跑大模型,真正的门槛不在参数量:一次 596 秒到 10 秒的压缩路径复盘
前端·人工智能
陈随易27 分钟前
Cloudflare 出钱,Vite 团队挑人,44 个维护者分 30 万美元
前端·后端·程序员
恋猫de小郭1 小时前
Flutter THLC 的 WebView 滚动终于从 70 FPS 提升到 120 FPS
android·前端·flutter
严肃小白兔2 小时前
TanStack Router 更新构建工具链:Node.js 兼容性、路由分割与前端工程实践
前端·node.js·状态模式
IT_陈寒2 小时前
Vue这个奇葩的响应式问题让我加班到凌晨
前端·人工智能·后端
风骏时光牛马2 小时前
功能可用性自动化测试验证
前端
LucianaiB12 小时前
【元宝搜索开发者征文大赛】AI时代,学得慢就不用学?用元宝搜索打造一个教程保质期,确保每一个教程符合你的现状
前端·人工智能·ai编程
excel12 小时前
JavaScript 对象池:减少高频对象创建与 GC 压力
前端
陈随易14 小时前
纯 Go 写的 JS 引擎,跑分超过了 C 语言的 QuickJS
前端·后端·程序员
子兮曰16 小时前
Chrome 权限元素实战:144 与 151 的渐进增强写法
前端·javascript·chrome