惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Palo Alto Networks Blog
大猫的无限游戏
大猫的无限游戏
Martin Fowler
Martin Fowler
GbyAI
GbyAI
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
量子位
T
The Blog of Author Tim Ferriss
Y
Y Combinator Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
CERT Recently Published Vulnerability Notes
Recent Announcements
Recent Announcements
A
About on SuperTechFans
aimingoo的专栏
aimingoo的专栏
P
Privacy International News Feed
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
博客园 - 叶小钗
L
Lohrmann on Cybersecurity
G
GRAHAM CLULEY
T
The Exploit Database - CXSecurity.com
Hugging Face - Blog
Hugging Face - Blog
P
Proofpoint News Feed
NISL@THU
NISL@THU
博客园 - Franky
C
Cybersecurity and Infrastructure Security Agency CISA
The Register - Security
The Register - Security
M
MIT News - Artificial intelligence
Know Your Adversary
Know Your Adversary
A
Arctic Wolf
F
Full Disclosure
T
Threat Research - Cisco Blogs
P
Privacy & Cybersecurity Law Blog
The Hacker News
The Hacker News
博客园 - 【当耐特】
D
Docker
T
Tailwind CSS Blog
S
SegmentFault 最新的问题
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Jina AI
Jina AI
Help Net Security
Help Net Security
V
Visual Studio Blog
小众软件
小众软件
B
Blog
Vercel News
Vercel News
云风的 BLOG
云风的 BLOG
N
News and Events Feed by Topic
Forbes - Security
Forbes - Security
N
Netflix TechBlog - Medium
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
C
Cisco Blogs
Security Archives - TechRepublic
Security Archives - TechRepublic

博客园 - 张润昊

Coding Agent 工程化实践《一》 : 前端页面自验实践 大模型为什么会产生幻觉?从原理到工程防御 Codex 的 Skill 到底是怎么被调用的? Superpowers:如何约束 Coding Agent 使用 Codex 的一次危险提醒 我的Nginx 的配置分析 NextJS 安全漏洞分析 AI工具学习02 - 使用 ChatGPT 进行 PRD 产品设计 NextJS01 - page router - 问题列表 Flutter02-布局 Flutter01-本地数据库 isar React 学习 03-两种 Api 的使用 React 学习 02-commit 渲染 React 学习 01-时间切片 安卓低机型卡顿分析以优化方案 命令行 查找某个结尾的文件. 总结下vim快捷键 React技术揭密学习(二) React技术揭密学习(一) Build your own React 前端监控系统博客总结 记账项目 - webpack优化 React源码解携(二): 走一趟render流程 macos更新后, MySQL不能启动问题
NextJS 02 - 服务端渲染
张润昊 · 2025-08-11 · via 博客园 - 张润昊

NextJS 02 - 服务端渲染

疑问列表

  • 如果是加了getServerProps就是在服务端渲染的话,那第一次会渲染哪些组件?
  • 如果这些组件里面用到了,需要在客户端执行的方法,该怎么办?
  • NextJS 是会在 page-router 的情况下,检查每个文件,导出了哪些方法吗?比如getServerProps, 或者是getStaticProps
  • 服务器上执行的 react 树和客户端还是否是同一个?服务器上,如何确定这个 react 树上哪些组件能生成,哪些不能生成?
  • 最后一个步骤上,能否动态的执行组件,生成组件。比如一个请求回来了,才再客户端生成某些组件

渲染流程

  1. 用户请求了域名https://aa.com/news/123
  2. 走中间件middleware.ts / 走路由rewrites/redirects
  3. 匹配页面pages/news/[id].tsx
  4. 运行getServerProps, 通过 context 获取一系列参数, 然后返回出来{props, redirect, notfound}
  5. 服务器上渲染react树, 得到进一步生成好的 HTML。
  6. 把 Html 和数据注入发送给浏览器,
    • html 时用户直接能看的内容,利于 seo
    • 数据注入是__NEXT_DATA__的 json,包括 props,还有路由信息
  7. 浏览器接管,下载数据,JS 等,开始执行 JS 代码,此时开始绑定事件啥的。
  8. useEffect / useLayoutEffect等都开始这行了。

如何确定哪些组件渲染

  • NexJS 会执行整个页面组件,然后统一进行渲染返回。
  • 三种情况下,组件不会被执行
    • 条件判断下,只有有数据才会渲染,这个数据又是在useEffect请求数据回来的
    • 使用了const Weather = dynamic(() => import('../components/Weather'), { ssr: false });
    • 或者是在服务端只渲染一个壳子,和第一种情况下同理。
  • 本质上,还是执行了一遍 react 树,然后生成 html。走不通的就拉倒了。

检查每个文件的方法

  • 是的会检查每个pages这个目录下的文件,看看都返回了什么

关于 react 树的问题

  • 执行两遍。服务端执行一遍,客户端执行一遍
  • 服务端执行一遍,生成第一次的 html
  • 客户端执行一遍,得到自己要的 ReactDom 虚拟树,对比 SSR 生成的 HTML,进行事件/状态绑定
  • 之后的交互,状态更新都在客户端执行

称为双端渲染+水合(SSR + Hydration)

关于对比 HTML,进行渲染 React 树

  • 客户端最终执行一个渲染函数hydrateRoot
  • const root = hydrateRoot(domNode, reactNode);
  • 客户端会渲染一遍 reactNode 得到一个 fiber 树,然后遍历容器里面的 dom 结构进行对齐
    • 类型对齐:期望是 div,实际也是 div。复用节点,只是绑定事件,矫正属性差异,class 啥的
    • 文本对齐,文本不一致就覆盖文本
    • 类型不对 / 数量不对,触发不匹配,React 会丢弃,并重建子树

关于强行插入 html 导致水合不匹配

  • 不会出现,因为服务端渲染的时候,会在代码里放一份getServerSideProps产生的数据,到客户端的时候,再执行一遍。

posted @ 2025-08-11 18:25  张润昊  阅读(59)  评论()    收藏  举报