React15 vs React16 核心区别

一句话总结:React15 是 Stack Reconciler(同步递归、不可中断);React16 换成 Fiber Reconciler(可中断、可调度、优先级),是底层大重构,同时新增一堆API

  1. 底层协调算法(最大区别)

✅ React15:Stack Reconciler

  • 递归同步diff,一旦开始渲染,不能中断,必须一次性整棵树走完

  • 任务时间长就阻塞主线程 → 页面卡顿、输入延迟、动画掉帧

  • 没有任务优先级概念

✅ React16:Fiber Reconciler

  • 把虚拟DOM拆成一个个Fiber节点,任务分片;可中断、可恢复、可优先级调度

  • 协调阶段(render)和提交阶段(commit)分开:

  • render:可中断,纯计算,不碰DOM

  • commit:一次性同步执行,操作DOM,不可中断

  • 为后面 Concurrent Mode、Suspense、Hooks 打下基础

⚠️ React16 默认还是同步渲染,只是底层架构支持异步可中断,并发模式在16里只是实验性的

  1. render 返回值变化(高频考点)
  • React15: render 只能返回单个根元素,多节点必须包一层 <div>

  • React16:

  • 可以返回数组、字符串、数字、null、布尔值

  • 支持 Fragment( <></> ),不用额外DOM包裹

jsx

// React16允许

render() {

return [

<p key="1">a</p>,

<p key="2">b</p>

]

}

  1. Error Boundary 错误边界(新增)
  • React15:子组件渲染报错 → 整个应用崩溃,状态错乱,只能刷新

  • React16:新增 componentDidCatch / static getDerivedStateFromError ,错误边界可以捕获子树渲染、生命周期、构造函数里的错误,展示降级UI,局部崩溃不炸全页

注意:不能捕获事件回调、异步代码、自身抛出的错误

  1. Portals 传送门(新增)

ReactDOM.createPortal(child, container)

  • React15:组件渲染出来的DOM一定在父组件DOM层级内,弹窗、tooltip 容易被 overflow:hidden 、z-index 截断

  • React16:可以把组件渲染到任意DOM节点,但事件冒泡依然遵循React组件树,而不是真实DOM树,非常适合弹窗

  1. 生命周期改动(重点)

React15 旧生命周期:

componentWillMount / componentWillReceiveProps / componentWillUpdate (常叫3个will)

React16:

  • 这三个 will 生命周期在Fiber下不安全(render阶段可中断,可能多次执行)

  • 16.3 引入新生命周期: getDerivedStateFromProps 、 getSnapshotBeforeUpdate

  • 标记三个will为不安全,后续版本逐步废弃

  • 执行顺序、触发时机和15有差异, setState 回调时机也变了

  1. setState 行为差异
  • React15: setState(null) 依然触发更新

  • React16: setState(null) 不触发更新,方便在updater函数里决定要不要更新

  • setState是批量更新,但批量规则在Fiber下有变化(合成事件内批量,原生事件/setTimeout里不批量)

  1. SSR 服务端渲染

React15: ReactDOMServer.renderToString 同步渲染,大页面阻塞

React16:支持流式SSR renderToNodeStream ,分段输出HTML,首屏更快

  1. 其他小差异

  2. ref:字符串ref逐渐不推荐,推荐 createRef / 函数ref(16.3正式推出 React.createRef )

  3. 事件系统:底层事件池在React17才移除,16还保留事件池

  4. 包拆分:React、ReactDOM拆分开,和15一致;但内部模块重构

  5. 返回 false 不再阻止渲染,16只认可渲染类型

快速对比表

特性 React15 React16

协调器 Stack,同步递归、不可中断 Fiber,分片、可中断、优先级

render返回 只能单个元素 数组、字符串、Fragment

错误处理 子组件报错整页崩 Error Boundary 局部降级

传送门 无 Portal

生命周期 3个will正常使用 标记will不安全,新增getDerivedStateFromProps

setState(null) 触发更新 不触发更新

SSR 同步renderToString 支持流式renderToNodeStream

如果你需要,我可以再给你一份面试背诵精简版,或者讲 Fiber 协调+commit阶段的详细流程。

相关推荐
驭渊的小故事5 小时前
Git 基础操作与对象观察
git
golang学习记6 小时前
IDEA 的 Java 智能,现在跑到 Cursor 和 VS Code 里去了
java·ide·vscode·intellij-idea·claude code
Hvitur6 小时前
Gitea 版本控制服务端【Red Hat 离线安装】
git
flytalei7 小时前
逐浪笔记 GitOps 实战:Jenkins 构建、Argo CD 同步与 Git 回滚
笔记·git·jenkins
熊出没8 小时前
CommitLoom 使用教程:在 IntelliJ IDEA 中自动生成 Git 提交信息
java·git·intellij-idea
IOT那些事儿1 天前
Git报错:Could not get HEAD hash
git·hash·head
纪伊路上盛名在1 天前
windows 配置vscode x11转发
ide·vscode·编辑器
杜哥无敌1 天前
Git Bash + acme.sh 实现 SSL 证书自动续签(完整指南)
git·bash·ssl
nunumaymax1 天前
Git教程
git