← 返回目录

第 1 卷

第 1 / 28 卷日期:

React18 核心面试题详细解答

一、React18 核心源码精读

React18 的核心升级围绕**并发渲染(Concurrent Rendering)**展开,核心源码可聚焦于调度层、渲染层的关键模块和特性:

1. 核心架构分层(源码核心目录)

React 源码采用分层架构,核心分为三层,对应源码目录( packages 下):

• 调度层(Scheduler):核心包 scheduler,负责任务优先级排序、时间切片(Time

Slicing),是并发渲染的基础。

• 协调层(Reconciler):核心包 react-reconciler,负责虚拟 DOM 对比(Diff 算法)、

Fiber 节点构建与更新调度,React18 中重构为「并发协调器」。

• 渲染层(Renderer):如 react-dom(浏览器端)、 react-native(原生端),负责将协

调层产出的 Fiber 树转化为真实 DOM 或原生组件。

2. 核心新特性源码关键点

(1)并发渲染(Concurrent Rendering)

• 核心概念:不再是同步阻塞式渲染,而是可以中断、暂停、恢复或放弃的渲染流程,源码中通过

isConcurrentMode 标识开启(React18 中通过 createRoot 默认启用)。

• 关键实现:基于 Fiber 架构的「可中断遍历」,Fiber 节点作为最小调度单元,每个 Fiber 节点遍历

后都会检查是否有更高优先级任务(如用户输入),若有则暂停当前渲染,保存上下文后切换任务。

(2)自动批处理(Automatic Batching)

• 核心逻辑:源码中通过 unstable_batchedUpdates 方法封装批处理逻辑,React18 中取消

了「仅合成事件内批处理」的限制,将 Promise、setTimeout、原生事件等异步场景的状态更新统一纳入批处理。

• 关键细节:批处理的本质是延迟执行 flushSync(刷新状态更新),当所有批量更新收集完成

后,一次性执行协调和渲染,减少 DOM 操作次数。

(3)Transitions(过渡更新)

• 核心 API: useTransition、 startTransition,源码中通过标记更新的优先级

• 关键实现:标记为 Transition 的更新会被归类为「非阻塞更新」,当有高优先级任务(如输入框输

(4)createRoot 与 legacyRoot

  • 源码差异: createRoot(React18 推荐)创建的是「并发根节点」,启用所有新特性;

ReactDOM.render(旧版)创建的是 legacyRoot(遗留根节点),兼容旧版同步渲染逻辑。

• 核心区别:根节点初始化时, createRoot 会初始化并发调度器,而 legacyRoot 仅初始化

同步调度器。

(5)Suspense 升级(数据加载支持)

• 源码实现:通过 SuspenseComponent Fiber 节点管理加载状态,当子组件抛出 Promise

时,React 会捕获该 Promise,暂停当前组件渲染,展示 fallback 内容,待 Promise 解析后再恢复渲染。

• 关键改进:React18 中 Suspense 支持服务端渲染(SSR)和并发渲染场景,源码中新增了

SuspenseList 组件用于控制多个 Suspense 组件的渲染顺序。

二、Redux 核心源码精读

Redux 是一款轻量级状态管理库,核心源码简洁(核心逻辑仅几百行),围绕「单向数据流」和「不可变状态」展开:

1. 核心模块与入口

Redux 核心包暴露 4 个关键 API: createStore(创建仓库)、 combineReducers(合并 reducer)、 applyMiddleware(应用中间件)、 compose(组合函数),核心逻辑集中在

createStore 中。

2. createStore 核心实现

• 初始化:接收 reducer、 preloadedState(初始状态)、 enhancer(增强器,如中间

件),内部维护 currentState(当前状态)、 currentReducer(当前 reducer)、 currentListeners(监听函数数组)。

• 核心方法:

a.getState():直接返回 currentState,获取当前状态(无副作用)。

  1. dispatch(action):唯一修改状态的入口,逻辑为: currentState =

currentReducer(currentState, action),执行 reducer 计算新状态,随后遍历执行所有监听函数。

3. combineReducers 核心实现
  • 核心作用:将多个子 reducer 合并为一个根 reducer,解决复杂应用状态拆分的问题。

• 实现逻辑:

  1. 校验传入的 reducer 对象,过滤无效 reducer(非函数类型)。
  2. 返回一个新的根 reducer,该 reducer 执行时,会遍历所有子 reducer,分别传入对应子状态

和 action,计算出各子状态的新值,最终合并为完整的根状态。

  1. 关键细节:只有子 reducer 返回新状态时,根状态对应的属性才会更新,保证状态不可变。
4. applyMiddleware 核心实现

• 核心作用:扩展 dispatch 功能,支持异步操作(如网络请求)、日志打印等副作用处理(Redux

原生 dispatch 仅支持同步 action)。

• 实现逻辑:

  1. 接收多个中间件作为参数,返回一个「仓库增强器」(函数)。
  2. 该增强器接收 createStore 作为参数,返回一个新的 createStore 函数,新函数创建

仓库时,会对 dispatch 进行包装。

  1. 通过 compose 函数组合所有中间件,形成一个中间件链,最终返回一个增强后的

dispatch,使得 action 会依次经过中间件处理后,再传入原生 dispatch。

  1. 经典中间件: redux-thunk(支持函数类型 action)、 redux-saga(异步流程管

理)、 redux-logger(打印 action 和状态日志)。

5. compose 核心实现

• 核心作用:从右到左组合多个函数,形成一个复合函数,用于中间件组合、仓库增强器组合等场

景。

• 实现逻辑:若传入空参数,返回一个恒等函数( x => x);若传入单个函数,直接返回该函

数;若传入多个函数,通过 reduce 方法从右到左依次组合,前一个函数的返回值作为后一个函数的参数。

三、React 设计思路与理念,及与 Vue 的异同

1. React 核心设计思路与理念

React 的设计围绕「组件化」和「声明式编程」展开,核心理念有 4 点:

全站分卷索引 · 28 卷
  1. 1第 1 卷
  2. 2第 2 卷
  3. 3第 3 卷
  4. 4第 4 卷
  5. 5第 5 卷
  6. 6第 6 卷
  7. 7第 7 卷
  8. 8第 8 卷
  9. 9第 9 卷
  10. 10第 10 卷
  11. 11第 11 卷
  12. 12第 12 卷
  13. 13第 13 卷
  14. 14第 14 卷
  15. 15第 15 卷
  16. 16第 16 卷
  17. 17第 17 卷
  18. 18第 18 卷
  19. 19第 19 卷
  20. 20第 20 卷
  21. 21第 21 卷
  22. 22第 22 卷
  23. 23第 23 卷
  24. 24第 24 卷
  25. 25第 25 卷
  26. 26第 26 卷
  27. 27第 27 卷
  28. 28第 28 卷