我是前端小卒,欢迎关注我的微信公众号【前端小卒】,一起深入探讨 React 内部实现与前端前沿技术!
react 源码概览
react的版本变化比较大,本次我们将以react19.2.0 为源码解析的版本。需要注意的是: 为了不占用过多的篇幅,本文中所有的源代码的函数都是移除开发代码之后的伪代码。
全流程工作机制
react的全流程在一定程度上可以分为四个阶段:
- 客户端初始化
- 调度/触发阶段
- 渲染阶段
- 提交阶段
这四个阶段环环相扣,共同构成了 React 高效、灵活的更新机制,同时在这四个章节的基础上,我们还会补充一些特殊的章节,去对react内部的事件机制、服务端组件、新增hooks进行额外的补充。这样不仅能够理解 React "为什么"这样工作,更能掌握"如何"利用这些知识去编写更高性能、更可维护的 React 应用,并能从容应对面试中关于 React 底层原理的提问。
为了让大家能对react全流程工作机制有个详细的了解,我也制作了一个流程图,方便大家对react的全流程有一个整体的了解。

相信上面的流程图能够让大家对react的总流程一个概念性的认知,让我们接下来对react的包进行一个整体的了解。
react包一览
打开 react packages 一起来看看react有哪些包。
javascript
packages/
├── dom-event-testing-library/
├── eslint-plugin-react-hooks/
├── internal-test-utils/
├── jest-react/
├── react/
├── react-art/
├── react-cache/
├── react-client/
├── react-debug-tools/
├── react-devtools/
├── react-devtools-core/
├── react-devtools-extensions/
├── react-devtools-fusebox/
├── react-devtools-inline/
├── react-devtools-shared/
├── react-devtools-shell/
├── react-devtools-timeline/
├── react-dom/
├── react-dom-bindings/
├── react-is/
├── react-markup/
├── react-native-renderer/
├── react-noop-renderer/
├── react-reconciler/
├── react-refresh/
├── react-server/
├── react-server-dom-esm/
├── react-server-dom-fb/
├── react-server-dom-parcel/
├── react-server-dom-turbopack/
├── react-server-dom-webpack/
├── react-suspense-test-utils/
├── react-test-renderer/
├── scheduler/
├── shared/
├── use-subscription/
└── use-sync-external-store/
大体上,我们可以将react的package包分为六类: 核心包、服务端渲染、渲染器、开发工具、工具包、实验性功能、绑定层。让我们一一揭开这六类的面纱。
react核心包
顾名思义,react核心包是react的核心功能,是react的基础,也是react的核心。
├── react/
├── react-reconciler/
├── scheduler/
react
这是React的基础包,提供了所有React组件的基本API,如 React.createElement、React.Component、React.useState等。包定义了React的公共接口,但不包含任何渲染相关的代码。当我们在项目中导入React时,实际上就是导入这个包。
react-reconciler
React的核心调和引擎,主要负责Fiber架构。当组件状态发生变化时,reconciler会计算出哪些DOM需要更新,然后交给渲染器执行实际的DOM操作。reconciler是React性能优化的核心所在,它实现了时间切片、优先级调度等特性,以保证用户体验的流畅性。
scheduler
调度器负责任务的优先级管理和执行时机控制。React通过scheduler来实现时间切片和并发模式,使得React可以在不阻塞主线程的情况下执行渲染工作。scheduler会根据任务优先级和浏览器的空闲时间来安排任务执行,确保用户交互的流畅性。
渲染器相关
java
├── react-dom/
├── react-native-renderer/
├── react-art/
├── react-test-renderer/
react-dom 包
React最常用的渲染器,负责将React组件渲染到浏览器DOM中。它包含了所有与浏览器DOM交互的代码,如事件系统、属性处理等。同时react-dom还提供了服务端渲染的功能(ReactDOMServer)。
react-native-renderer 包
React Native的渲染器,负责将React组件渲染为原生移动应用UI组件,将React的声明式编程模型带到了移动应用开发中。
react-art 包
一个用于绘制矢量图形的渲染器,可以将React组件渲染为SVG、Canvas等图形。
react-test-renderer 包
用于测试的渲染器,可以将React组件渲染为纯JavaScript对象,方便进行快照测试和单元测试。它不依赖DOM环境,可以在Node.js中运行。
开发工具
├── react-devtools-core/
├── react-devtools-extensions/
├── react-refresh/
react-devtools-core 包
这是React开发者工具的核心实现,提供了组件树检查、性能分析等功能的底层支持。
react-devtools-extensions
基于core包构建的浏览器扩展,为Chrome、Firefox等浏览器提供React调试工具。这些工具可以帮助开发者检查组件层次结构、props和state变化、性能瓶颈等。
react-refresh
实现了React的热更新功能,使得在开发过程中修改代码后,浏览器可以在不丢失组件状态的情况下更新UI。这大大提高了开发效率,是现代React开发工作流的重要组成部分。
服务端渲染
vbscript
├── react-devtools-core/
├── react-server-dom-webpack/
react-server
提供了React服务端渲染的核心功能,支持在Node.js环境中渲染React组件。
react-server-dom-webpack
React Server Components的实现,允许组件在服务器上渲染并将结果流式传输到客户端。这种方式可以减少客户端JavaScript的体积,提高首屏加载速度,同时保持React组件模型的一致性。它与webpack集成,处理模块加载和代码分割。
工具包
vbnet
├── react-is/
├── react-cache/
├── shared/
react-is
提供了一系列工具函数,用于检测React元素的类型。例如,可以用它来判断一个对象是否是React元素、Fragment、Context等。这在开发库和高阶组件时特别有用。
react-cache
实现了资源缓存的功能,主要用于React Suspense特性。它可以缓存异步请求的结果,避免重复请求,提高应用性能。
shared
包含了React各个包之间共享的工具函数和常量,如对象池、错误处理、环境检测等。这些代码被多个React包复用,确保了行为的一致性。
绑定层
perl
├── react-dom-bindings/
├── use-subscription/
react-dom-bindings
react-dom的底层实现,负责将React的通用渲染逻辑与具体的DOM操作绑定起来。它处理DOM元素的创建、属性更新、事件系统等细节。
use-subscription
提供了一个React Hook,用于安全地订阅外部数据源。它确保组件在卸载时正确地取消订阅,避免内存泄漏和无效更新。
