Skip to content

Nuxt 知识库入口 ​

这一套文档是 Nuxt 3 / 4 的系统梳理,重点不在 API 罗列,而在把三件事讲透:SSR 到底怎么跑起来的、服务端的数据是怎么"带"到浏览器的(序列化 / Payload)、浏览器又是怎么把静态 HTML 变成可交互应用的(水合 Hydration)。后半部分是工程使用:目录约定、路由与中间件、数据获取、渲染模式、部署和高频踩坑。适合写过 Vue SPA、第一次接触服务端渲染的开发者。

先立心智模型:Nuxt 是 Vue 的「全栈外壳」 ​

你以为的 Nuxt实际上的 Nuxt
一个"Vue 的脚手架"一套约定式全栈框架:Vue 3 负责 UI,Vite 负责构建,Nitro 负责服务端,文件目录负责路由与 API
"SSR 就是服务端输出 HTML"SSR 只是首屏那一半;Nuxt 默认的是 Universal Rendering(同构渲染):首屏服务端出 HTML,之后客户端接管变回 SPA
"服务端渲染完就结束了"服务端渲染时的状态必须序列化进 HTML,客户端才能用同一份数据水合,否则界面会跳变或报 mismatch
"页面里直接 fetch 就行"双端都能执行的代码必须用 Nuxt 提供的 useFetch / useAsyncData / useState,它们才负责去重、缓存、进 payload、跨端一致
"代码只跑在浏览器"同一段 setup 会先跑一次服务端、再跑一次客户端,于是 window、localStorage、随机数、时区都成了坑

一句话概括全站:

同一份 Vue 组件代码,在服务端生成 HTML + 一份可序列化的状态(Payload),浏览器拿到后下载 JS、读取这份状态、把已有 DOM「激活」成 Vue 应用,之后的交互与跳转都在客户端完成。

理解了这句话,SSR、序列化、水合、双端差异、useFetch 为什么存在,就都是它的推论。

一次 SSR 请求,完整时间线 ​

① 浏览器   GET /posts/42
② Nitro    匹配 routeRules / server middleware,为「本次请求」新建一个 Nuxt app 实例
③ 服务端   执行路由中间件 → 页面 setup → useFetch / useAsyncData 取数
④ 服务端   renderToString(vueApp) → HTML 字符串
           └── 同时把 useState + 异步数据用 devalue 序列化成 Payload,内联进 HTML
⑤ 浏览器   收到 HTML:立刻能看到内容(FCP 快、爬虫能抓到完整正文)
           └── <script type="application/json" id="__NUXT_DATA__">…</script>
⑥ 浏览器   下载 JS chunk → 创建同一份 Vue app(createSSRApp)→ 读取 Payload
⑦ 水合     hydrate():复用已有 DOM、绑定事件、恢复响应式 → 页面可交互
⑧ 之后     <NuxtLink> 跳转不再回服务器,走客户端路由 + 客户端取数(或按需加载 _payload.json)

其中 ③~⑤ 是 SSR,⑤ 里那坨 JSON 是 序列化 / Payload,⑥~⑦ 是 水合。这三个环节分别展开在下面三篇里。

三个最容易糊的概念(先给结论) ​

概念一句话为什么必须存在深入阅读
SSR服务端把组件渲染成 HTML 字符串返回首屏不用等 JS 下载执行,SEO / 分享卡片拿到真实内容SSR 原理
序列化 / Payload把服务端内存中的状态变成可传输、可还原的 JSON 数据,塞进 HTML服务端内存对象和浏览器之间隔着一次 HTTP,客户端还得用同一份数据渲染出同样的 DOM序列化与 Payload
水合 Hydration客户端 Vue 不重建 DOM,而是"认领"服务端已生成的 DOM 并挂上事件与响应式若重新 mount 会整页重建(闪烁、丢焦点),若数据不一致则 DOM 对不上,产生 hydration mismatch水合机制

子页导航 ​

序号主题你会学到
1SSR 原理:一次请求的完整链路CSR 的瓶颈、Universal Rendering 架构、8 步请求链路、双端执行差异表、SSR 的收益与代价、常见误解
2序列化与 Payload为什么必须序列化、__NUXT_DATA__ 长什么样、devalue 能/不能序列化什么、useState 与 useAsyncData 如何进出 payload、_payload.json、体积与安全坑
3水合 Hydration 与 mismatchcreateSSRApp + hydrate 做了什么、mismatch 全成因清单、定位手法、<ClientOnly> / <NuxtClientFallback> / onMounted 修复工具箱、延迟水合与岛屿架构
4数据获取与跨端状态useFetch / useAsyncData / $fetch 对照、key 去重与缓存、cookie/请求头转发、useState 与 Pinia、常见二次请求与瀑布问题
5上手与工程结构安装与命令、Nuxt 3/4 目录约定、自动导入、最小可运行示例、nuxt.config.ts 常用配置、模块生态、构建产物
6路由、布局、中间件与服务端层文件路由规则、definePageMeta、layouts、三种 middleware、plugins、server/api 与 Nitro/h3、一个完整鉴权示例
7渲染模式、routeRules 与部署SPA / SSR / SSG / ISR / SWR / 混合渲染、routeRules 配置大全、缓存层次、Nitro preset 与部署选型、模式决策树
8高频踩坑与速查表15 条症状→原因→修复清单、环境判断与 API 速查、线上问题排查流程、学习路线

建议路径:1 → 2 → 3 是地基(尤其 2、3 两篇,是绝大多数"页面闪一下 / Hydration mismatch / 接口请求两次"的根因);4~6 是日常开发查阅;7 决定项目形态与上线方式;8 在遇到诡异现象时回来对照。

速查总表:渲染模式怎么选 ​

模式开关HTML 何时生成适用场景代价
SPA(CSR)ssr: false浏览器执行 JS 时后台管理、登录后系统、强交互工具首屏白屏、SEO 差
Universal SSR(默认)默认开启每个请求在服务端生成内容站、电商详情、需要 SEO 且数据动态需要服务端运行时、TTFB 受后端影响
SSG / 预渲染nuxi generate、prerender: true构建时生成文档、博客、营销页数据变了要重新构建
ISRrouteRules: { '/**': { isr: 60 } }首次请求生成后缓存 N 秒商品页、新闻页,内容多且更新不频繁需要支持缓存的部署平台
SWR 缓存routeRules: { '/**': { swr: 60 } }缓存 + 后台再生高流量读多写少页面短暂陈旧数据、缓存失效策略
混合渲染按路由配 routeRules各路由自己决定一个项目里既有后台又有官网配置复杂度上升

Nuxt 最被低估的能力就是按路由混合渲染:/admin/** 关掉 SSR 当 SPA,/blog/** 走 ISR,/about 构建时静态化,/ 走实时 SSR,全部在同一个项目里用 routeRules 表达。详见第 7 篇。

术语表 ​

术语含义
Universal / 同构渲染同一套组件代码既跑服务端又跑客户端:SSR 首屏 + SPA 后续导航,Nuxt 默认模式
NitroNuxt 的服务端引擎,负责 HTTP 服务、server/api、缓存、预渲染、多平台部署产物
h3Nitro 内置的极简 HTTP 框架,defineEventHandler / readBody / getCookie 都来自它
Payload服务端渲染结果之外,额外注入 HTML 的那份状态数据(state + data + error + once)
devalueNuxt 用来序列化 Payload 的库,支持 Date/Map/Set/循环引用等,并防 </script> 注入
Hydration mismatch客户端按数据预期生成的 vnode 与服务端 HTML 对不上,Vue 报警告并局部重建
TTFB / FCP / TTI首字节时间 / 首次内容绘制 / 可交互时间;SSR 主要改善 FCP,但会牺牲一部分 TTFB 与 TTI
Island / Server Component只水合页面中需要交互的部分,其余保持静态 HTML,用来降低水合成本

学习资源 ​

  • Nuxt 官方文档:Getting Started → Going Further 的「Rendering」与「Data Fetching」两节与本套文档 1~4 篇对照阅读。
  • Vue 官方 SSR 指南:把 renderToString / createSSRApp / hydration 的底层机制讲得最清楚。
  • Nitro 文档:部署 preset、routeRules、缓存 API 的权威来源。
  • devalue:读 README 的 "What can be serialized" 一节,Payload 能放什么一目了然。
  • Nuxt Modules 生态:Content / Image / UI / i18n / Pinia 等官方与社区模块。