BetaSu / big-react
- среда, 27 июля 2022 г. в 00:33:32
跟着我,从0实现React18
从零实现 React v18 的核心功能,特点如下:
Git Tag
划分迭代步骤,记录从 0 实现的每个功能类型 | 内容 | 完成情况 | 在哪个版本实现的 |
---|---|---|---|
架构 | monorepo(pnpm 实现) | v1 | |
规范 | eslint | v1 | |
规范 | prettier | v1 | |
规范 | commitlint + husky | v1 | |
规范 | lint-staged | v1 | |
规范 | tsc | v1 | |
测试 | jest 环境搭建 | v4 | |
规范 | tsc | v1 | |
构建 | babel 配置 | v4 | |
构建 | Dev 环境包的构建 | v1 | |
构建 | Prod 环境包的构建 | ||
部署 | Github Action 执行 lint 与 test | ||
部署 | Github Action 根据 tag 发布 npm 包 |
当前跑通 React 官方测试用例 17 个
类型 | 内容 | 完成情况 | 在哪个版本实现的 |
---|---|---|---|
React | JSX 转换 | v1 | |
React | React.isValidElement | v4 | |
ReactDOM | 浏览器环境 DOM 的插入 | v2 | |
ReactDOM | 浏览器环境 DOM 的移动 | v7 | |
ReactDOM | 浏览器环境 DOM 的属性变化 | ||
ReactDOM | 浏览器环境 DOM 的删除 | v5 | |
ReactDOM | ReactTestUtils | v4 | |
ReactNoop | ReactNoop Renderer | ||
Reconciler | Fiber 架构 | v1 | |
Reconciler | 事件模型 | v6 | |
Reconciler | onClick 事件支持 | v6 | |
Reconciler | input 元素 onChange 事件支持 | ||
Reconciler | Lane 模型 | ||
Reconciler | 基础 Update 机制 | v1 | |
Reconciler | 带优先级的 Update 机制 | ||
Reconciler | 插入单节点的 mount 流程 | v1 | |
Reconciler | 插入多节点的 mount 流程 | v7 | |
Reconciler | 插入单节点的 reconcile 流程 | v5 | |
Reconciler | 插入多节点的 reconcile 流程 | v7 | |
Reconciler | 删除节点的 reconcile 流程 | v5 | |
Reconciler | HostText 类型支持 | v2 | |
Reconciler | HostComponent 类型支持 | v1 | |
Reconciler | HostRoot 类型支持 | v1 | |
Reconciler | FunctionComponent 类型支持 | v3 | |
React | Hooks 架构 mount 时实现 | v3 | |
React | Hooks 架构 update 时实现 | v5 | |
Reconciler | useState 实现 | v3 | |
Reconciler | useEffect 实现 | ||
Reconciler | useRef 实现 | ||
Reconciler | Legacy 调度流程 | ||
Reconciler | Concurrent 调度流程 | ||
Reconciler | 异常处理流程 | ||
Reconciler | useErrorBoundary 实现 |
提供 3 种调试方式:
执行pnpm demo
会运行项目demos
目录下的示例项目(默认项目是针对v7的调试项目)
这种方式的好处是:
控制台会打印各个主要步骤的执行信息,可以直观看到执行流程
热更新(包括示例代码和源码代码)
通过CRA
或Vite
起一个React
测试项目后,在本项目执行pnpm run build:dev
打包react
与react-dom
,在测试项目中通过pnpm link
将项目依赖的react
与react-dom
替换为我们打包的react
与react-dom
这种方式的好处是:最贴合项目中实际使用React
的情况
React
官方的测试用例执行pnpm test
跑官方的测试用例,用例中引用的是执行pnpm run build:dev
打包的react
与react-dom
这种方式的好处是:可以从官方用例的角度观察框架实现的细节、各种边界情况
实现了多节点 reconcile 流程(俗称的 Diff 算法),包括如下功能:
修复了 update 时 onClick 回调不更新的 bug
插入多节点的 mount 流程
插入多节点的 reconcile 流程
浏览器环境 DOM 的移动
Diff 算法的测试用例还依赖 useEffect、useRef 的实现,放在后面再实现
实现事件系统,包括如下功能:
实现单节点 update,包括如下功能:
初始化测试相关架构,包括如下功能:
实现 useState 的 mount 时流程,包括如下功能:
插入单节点的 mount 流程(可以在浏览器环境渲染 DOM),包括如下功能:
插入单节点的 render 阶段 mount 流程,包括如下功能:
注:还未实现浏览器环境下的渲染