react源码调试

500 阅读2分钟

配置说明

  • node v18.19.1
  • pnpm v9.7.0
  • 通过配置 webpack alias,来实现对源码的映射
  • 部分截图使用了SourceTree
  • 文章底部有源码链接,源码包含v18.1.0、v19.0.0两个分支,对应debug不同版本

初始化app

使用create-react-app创建项目,依赖使用pnpm,该项目用于测试各个版本的react源码。当前的create-react-app创建的项目react版本还是v18.3.1

// 初始化
npx create-react-app react-debug

// 将配置弹出,该操作不可逆
npm i && npm run eject

// 依赖管理
rm -rf node_modules package-lock.json && pnpm i

对项目的基本配置做些调整,添加reset.css、测试的组件。将该项目commit,提交到远程仓库。

react源码

git clone https://github.com/facebook/react.git

创建新的分支v19.0.0,将源码中的packages文件夹,放到react-debug的src下,调整webpack alias

// config/paths.js
reactSrc: resolveApp("src/packages"),
// config/webpack.config.js
alias: {
  "@/components": path.join(paths.appSrc, "components"),
  react: path.join(paths.reactSrc, "react"),
  "react-dom": path.join(paths.reactSrc, "react-dom"),
  "react-client": path.join(paths.reactSrc, "react-client"),
  shared: path.join(paths.reactSrc, "shared"),
  scheduler: path.join(paths.reactSrc, "scheduler"),
  "react-reconciler": path.join(paths.reactSrc, "react-reconciler"),
  "react-dom-bindings": path.join(paths.reactSrc, "react-dom-bindings"),
}

修复报错

react、react-dom的引用方式

image.png

image.png

环境变量

image.png

config/env.js

image.png

引用失败

image.png 这是源码中的变量引用报错了,修复之前先commit下,保存下原始的react代码。 根据路径,找到报错的文件./src/packages/shared/ReactSharedInternals.js。我是对比之前调试react版本v18.1.0,修复的该问题

// v18.1.0
import ReactSharedInternals from 'react/src/ReactSharedInternals'

发现v19.0.0没有了该文件,但是发现有两个比较相似的ReactSharedInternalsClient.js、ReactSharedInternalsServer.js,我们是在浏览器调试的spa引用,就改成client这份

image.png

语法错误

image.png 问了下gpt,给出的原因是语法错误,先简单修复下

image.png

Scheduler变量报错

image.png 该问题也是参考调试v18.1.0版本的方法

image.png

ReactFiberConfig

image.png 同样参考调试v18.1.0版本的方法

// v18.1.0
export * from "./forks/ReactFiberHostConfig.dom";

但是发现v19.0.0源码已经没有了该文件,根据其内容进行全局搜索,发现 react-dom-bindings/src/client/ReactFiberConfigDOM 内容与之相同。

image.png 发现有了新的报错,继续查找bindToConsole image.png 发现在ReactClientConsoleConfigBrowser.js、ReactClientConsoleConfigServer.js,我们依旧选择使用适用于浏览器的ReactClientConsoleConfigBrowser.js。

image.png 该文件还引用了ReactFiberConfigDOM.js。我们将ReactFiberConfig.js的引用载替换下

image.png

eslint报错

image.png

我们先将eslint的报错关掉

image.png

React DevTools

image.png 把他也关掉吧,我平时没怎么用过

image.png

结语

可以调试了,感谢冴羽的分享。源码地址