基本信息
文件名称:React源码调试方式.docx
文件大小:21.01 KB
总页数:13 页
更新时间:2025-07-02
总字数:约5.85千字
文档摘要

React源码调试方式

目录正文断点调试搜索定位ChromeDevtools调试sourcemapnpm下载react包插件注释调试React最初源码关联react源码项目总结

正文

什么?调试React源码还有优雅和不优雅之分?

别着急,我们先来听个故事:

东东是一名前端工程师,主要用React技术栈,用了多年之后想深入一下,所以最近开始看React源码。

断点调试

他把react和react-dom包下载了下来,在项目里引入,开发服务跑起来后,打开ChromeDevtools打断点调试。

这样调试了一段时间之后,他有了一些困惑:

这样调试是可以的,但是总感觉和源码有段距离,因为调试的是react-dom.development.js

搜索定位

而源码里这些逻辑是分散在不同的包里的,所以就算搞懂了逻辑,也不知道这些逻辑在哪些包里,只能靠搜索来定位。

所以他就在想,是不是有更好的调试方式,能够调试React最初的源码呢?

于是,他跑来问我:光哥,你调试React源码会有这些问题么?你是怎么调试的呀?

我说,确实,我最开始也是调试的react-dom.development.js,但是现在已经能直接调试React最初的源码了,而且是在VSCode里调试的,点击调用栈能直接打开对应的React源码文件并定位到对应行列号:

哇哦,这就是我想要的调试效果,这是怎么做到的呀。

想实现这样的调试效果确实还有点复杂,我们一点点来看:

首先,我们要做到在VSCode里调试React项目,而不是在ChromeDevtools里,这样才能做到直接打开对应的文件:

用VSCode调试React项目

我们用create-react-app创建一个react项目,然后npmrunstart跑起来。

ChromeDevtools调试

这时候浏览器访问就可以用ChromeDevtools调试了:

但我们的目标是在VSCode里调试,所以要添加一个VSCode的debugger配置:

在根目录下建一个.vscode/launch.json的文件,添加一个chrome类型的调试配置,输入调试的url。

然后点击debug启动:

这时候就可以在VSCode里直接打断点调试了:

用VSCode调试肯定会比ChromeDevtools方便一些。但这不是我们最主要的目的,现在调试的依然是react-dom.development.js:

那怎么调试react最初的源码呢?

这就涉及到sourcemap的作用了:

sourcemap

JS代码经过编译,会产生目标代码,但同时也会产生sourcemap。sourcemap的作用就是映射目标代码中的位置和源码中的位置。

比如源码中的第3行第5列的代码对应着编译后的第1行第10列的代码。

类似这样的映射有很多,经过编码以后是这样的:

在js文件最后一行,加上这样一行注释就可以关联sourcemap:

//#sourceMappingURL=/path/to/your/sourcemap.map

调试工具支持解析sourcemap来映射调试的代码位置到源代码中的位置。

比如chromedevtools的Sources面板就会提示从哪个文件sourcemapping过来的,点击链接还可以跳到映射之前的文件:

同样,VSCodeDebugger也支持sourcemap,有个sourceMaps的调试配置选项来开启和关闭sourcemap功能,默认开启。

那这么说我们只要让react-dom.development.js关联上sourcemap,就能调试最初的React源码了?

理论上是这样的,但是现在下载的react、react-dom包里都不带sourcemap,我们得把React源码下载下来自己build:

build出带有sourcemap的react包

npm下载react包

用npm下载的react包是这样