React 源码面试冲刺计划

5 阅读6分钟

React 源码面试冲刺计划

目标:应对资深前端面试(含源码问题) 周期:6-8 周(每天 1-2 小时)


🎯 面试考核维度

根据资深前端岗位要求,React 源码面试主要考这些:

维度考察点占比
核心原理Fiber、Reconciler、Commit 流程25%
Diff 算法对比策略、key 的作用20%
Hooks 原理状态管理、副作用、依赖优化20%
渲染优化memo、useMemo、useCallback15%
并发模式Suspense、Transition、优先级10%
周边知识VDOM、函数式编程、工程化10%

🗓️ 完整学习计划(6 周)

第 1 周:React 基础架构 + API 能力

目标:理解 React 整体架构,熟练掌握所有 API

天数主题源码文件面试点
Day 1React 包入口与核心 APIpackages/react/src/ 全部过一遍常用 API 有哪些
Day 2JSX 转换原理jsx/ReactJSXElement.jsjsx vs createElement
Day 3组件定义方式ReactBaseClasses.js, ReactForwardRef.js函数组件 vs Class
Day 4Props 处理ReactElement.js, ReactPropTypes.jsprops 传递与校验
Day 5ref 实现ReactCreateRef.js, ReactForwardRef.jsref 获取 DOM
Day 6context 原理ReactContext.js跨组件通信
Day 7本周总结 + 整理笔记画架构图

📌 面试必问题:

  • React 项目中有哪些核心包?各自职责是什么?
  • 函数组件和 Class 组件的区别?
  • 为什么 Hooks 不能在条件语句中调用?

第 2 周:Hooks 核心原理(重灾区!)

目标:彻底理解 Hooks 底层机制

天数主题源码文件面试点
Day 8Hooks 分发机制ReactHooks.jsDispatcher 是什么
Day 9useState 实现react-reconciler/ReactHooks.js状态如何存储
Day 10useReducer 实现同上状态更新逻辑
Day 11useEffect 实现同上副作用时机、清理函数
Day 12useLayoutEffect vs useEffect同上同步 vs 异步
Day 13useRef 实现同上ref 和 useState 的区别
Day 14useMemo / useCallback同上性能优化原理

📌 面试必问题:

  • useState 的实现原理?什么是 Hooks 链表?
  • useEffect 的执行时机?是同步还是异步?
  • useEffect 依赖项为空数组和专业摄影棚有啥区别?
  • useMemo 和 useCallback 有什么用?怎么用?
  • 如何理解闭包陷阱?

第 3 周:Fiber 架构(最核心!)

目标:理解 React 16+ 的核心架构变革

天数主题源码文件面试点
Day 15Fiber 是什么react-reconciler/ReactFiber.js为什么叫 Fiber
Day 16Fiber 数据结构同上节点结构、child、sibling
Day 17渲染阶段 WorkLoopReactFiberWorkLoop.jsrender 阶段做了什么
Day 18Commit 阶段同上commit 阶段做了什么
Day 19任务调度 Schedulerscheduler/src/Scheduler.js优先级如何确定
Day 20优先级机制ReactFiberLane.jslanes、lanes 优先级
Day 21本周总结 + 整理笔记画 Fiber 流程图

📌 面试必问题:

  • 什么是 Fiber?解决了什么问题?
  • React 的渲染流程是怎样的?render 和 commit 阶段的区别?
  • 什么是协调(Reconciler)?做什么的?
  • Scheduler 的作用?和浏览器的关系?
  • 优先级是如何实现的?

第 4 周:Diff 算法(必考!)

目标:掌握 React 高效更新的核心算法

天数主题源码文件面试点
Day 22Diff 算法的整体思路react-reconciler/ReactFiberReconciler.jsO(n) 算法
Day 23对比策略:treeDiff同上跨层级移动
Day 24对比策略:componentDiff同上类型不同会怎样
Day 25对比策略:elementDiff同上key 的作用
Day 26列表对比优化同上为什么不能用 index 做 key
Day 27双缓冲技术ReactFiber.jscurrent、workInProgress
Day 28本周总结能手写简单 Diff

📌 面试必问题:

  • React 的 Diff 算法是怎么工作的?
  • 为什么要有 key?key 的作用是什么?
  • 为什么不能用 index 作为 key?
  • 什么是双缓冲?current 和 workInProgress 是什么关系?

第 5 周:并发与性能优化

目标:掌握 React 18 新特性 + 性能优化手段

天数主题源码文件面试点
Day 29Concurrent 模式ReactFiberWorkLoop.js并发渲染是什么
Day 30startTransitionReactStartTransition.js如何优化交互
Day 31useDeferredValueReactHooks.js延迟渲染
Day 32Suspense 原理ReactSuspense.js异步加载
Day 33useSyncExternalStoreReactHooks.js外部状态管理
Day 34React.memo 原理ReactMemo.js浅比较
Day 35性能优化最佳实践实际场景分析

📌 面试必问题:

  • React 18 的并发是什么?带来了什么新特性?
  • startTransition 和 useDeferredValue 的区别?
  • Suspense 是怎么工作的؟
  • 如何做性能优化?memo、useMemo、useCallback 怎么选?

第 6 周:周边知识 + 实战 + 面试模拟

天数主题内容
Day 36事件系统react-dom-bindings/src/events/
Day 37虚拟 DOM理解 VDOM 本质
Day 38函数式编程纯函数、柯里化、组合
Day 39状态管理Redux、Zustand、Recoil 思路
Day 40-42动手实现 Mini React核心功能 200 行代码
Day 43-44常见面试题训练整理高频题
Day 45模拟面试自问自答录音

📚 源码重点章节优先级

⭐⭐⭐ 必须完全掌握

react-reconciler/src/
├── ReactFiberWorkLoop.js    # 渲染循环(最重要!)
├── ReactFiberHooks.js       # Hooks 实现
├── ReactFiberReconciler.js  # Diff 算法入口
├── ReactFiber.js            # Fiber 数据结构

scheduler/src/
└── Scheduler.js             # 调度器

⭐⭐ 熟练理解

packages/react/src/
├── ReactHooks.js            # Hooks API 入口
├── ReactChildren.js         # Children 处理
├── ReactContext.js          # Context

packages/react-dom/src/
├── client/
│   └── ReactDOMComponent.js # DOM 操作

⭐ 有印象即可

scheduler/src/
├── SchedulerPriorities.js   # 优先级
├── minimalClient.js         # 平台适配

📝 每阶段自查清单

�� 1 周完 ✅

  • 能说出 react、react-dom、reconciler 的关系
  • 熟悉所有常用 API
  • 能解释 JSX 转译流程
  • 能手写 JSX 转换

第 2 周完 ✅

  • 能画出 Hooks 链表结构图
  • 理解 useState/useEffect 原理
  • 能解释闭包问题
  • 能回答 5 道以上 Hooks 面试题

第 3 周完 ✅

  • 深刻理解 Fiber 是什么
  • 能描述 render 和 commit 阶段
  • 理解优先级机制
  • 能手画渲染流程图

第 4 周完 ✅

  • 能写简单 Diff 算法
  • 理解 key 的重要作用
  • 理解双缓冲
  • 能回答 Diff 相关面试题

第 5 周完 ✅

  • 理解并发渲染
  • 会用 Suspense、Transition
  • 能根据场景选择优化方案

第 6 周完 ✅

  • 有自己的 Mini React 项目
  • 能流畅回答源码问题
  • 通过模拟面试

🧐 高频面试题分类汇总

一、基础概念

  1. React 是什么?核心思想是什么?
  2. Virtual DOM 是什么?有什么优缺点?
  3. 什么是 JSX?为什么需要 JSX?

二、组件与生命周期

  1. 函数组件和 Class 组件的区别?
  2. 组件通信的方式有哪些?
  3. 受控组件和非受控组件的区别?

三、Hooks(重灾区)

  1. Hooks 的实现原理?
  2. 为什么 Hooks 不能在条件语句中调用?
  3. useEffect 的执行时机?
  4. useEffect 依赖项为空数组和专业摄影棚有啥区别?
  5. 什么是闭包陷阱?如何解决?
  6. useMemo 和 useCallback 的区别?
  7. useRef 和 useState 的区别?

四、Fiber 与渲染

  1. 什么是 Fiber?解决了什么问题?
  2. React 的渲染流程是怎样的?
  3. 什么是协调(Reconciler)?
  4. Render 和 Commit 阶段的区别?

五、Diff 算法(必考)

  1. React 的 Diff 算法是怎么工作的?
  2. 为什么要有 key?key 的作用?
  3. 为什么不能用 index 做 key?

六、性能优化

  1. 如何做性能优化?
  2. React.memo、useMemo、useCallback 如何选?
  3. 什么是 React 的并发模式?

七、React 18

  1. React 18 有哪些新特性?
  2. startTransition 有什么用?
  3. Suspense 原理?

📂 源码目录结构(随时查阅)

react/
├── packages/
│   ├── react/                    # 核心 API
│   │   └── src/
│   │       ├── ReactHooks.js     # 👈 Hooks 入口
│   │       ├── ReactContext.js   # Context
│   │       ├── ReactChildren.js  # Children 处理
│   │       └── jsx/              # JSX 转换
│   │
│   ├── react-reconciler/         # 👈 核心(最重要!)
│   │   └── src/
│   │       ├── ReactFiberWorkLoop.js  # 渲染循环
│   │       ├── ReactFiberHooks.js     # Hooks 实现
│   │       ├── ReactFiberReconciler.js # Diff 算法
│   │       └── ReactFiber.js          # Fiber 数据结构
│   │
│   ├── react-dom/                # DOM 渲染
│   │   └── src/
│   │       └── client/
│   │
│   └── scheduler/                # 任务调度
│       └── src/
│
└── scripts/                      # 构建脚本

🚀 立即开始

从 Day 1 开始吧!Day 1:React 包入口

出发!💪