如何直接调试React源码

184 阅读1分钟

一、克隆源码

源码地址:github.com/facebook/re… ,使用18.3.1

本地node版本:17.x

git clone https://github.com/facebook/react #克隆源码
cd react
git checkout 18-3-1 #切换到18.3.1版本源码
yarn #安装依赖

截屏2025-02-28 15.51.02.png 截屏2025-02-28 15.58.19.png

二、安装vite

cd packages
npm create vite@4 #使用vite建项目,node17最高支持vite@4
cd ..
yarn # 项目根目录下重新安装依赖,monorepo自动连接inspire包
yarn add vite-plugin-babel -W #vite需要使用babel插件处理源码中的flow和jsx代码

截屏2025-02-28 16.04.54.png 截屏2025-02-28 16.13.38.png

  1. packages/inspire下新建vite.config.js,内容如下
import { defineConfig } from 'vite'
import babelPlugin from 'vite-plugin-babel'
import {
    DARK_MODE_DIMMED_WARNING_COLOR,
    DARK_MODE_DIMMED_ERROR_COLOR,
    DARK_MODE_DIMMED_LOG_COLOR,
    LIGHT_MODE_DIMMED_WARNING_COLOR,
    LIGHT_MODE_DIMMED_ERROR_COLOR,
    LIGHT_MODE_DIMMED_LOG_COLOR,
    GITHUB_URL,
    getVersionString,
} from 'react-devtools-extensions/utils';
const NODE_ENV = process?.env?.NODE_ENV;

const __DEV__ = false;

const DEVTOOLS_VERSION = getVersionString();

const EDITOR_URL = process.env.EDITOR_URL || null;
const LOGGING_URL = process.env.LOGGING_URL || null;
export default defineConfig({
    plugins: [
        babelPlugin({
            babelConfig: {
                presets: ['@babel/preset-flow', '@babel/preset-react'] // 处理flow和jsx
            }
        })
    ],
    define: // 全局变量
    {
        __DEV__,
        __EXPERIMENTAL__: true,
        __EXTENSION__: false,
        __PROFILE__: false,
        __TEST__: NODE_ENV === 'test',
        'process.env.DEVTOOLS_PACKAGE': `"react-devtools-core"`,
        'process.env.DEVTOOLS_VERSION': `"${DEVTOOLS_VERSION}"`,
        'process.env.EDITOR_URL': EDITOR_URL != null ? `"${EDITOR_URL}"` : null,
        'process.env.GITHUB_URL': `"${GITHUB_URL}"`,
        'process.env.LOGGING_URL': `"${LOGGING_URL}"`,
        'process.env.NODE_ENV': `"${NODE_ENV}"`,
        'process.env.DARK_MODE_DIMMED_WARNING_COLOR': `"${DARK_MODE_DIMMED_WARNING_COLOR}"`,
        'process.env.DARK_MODE_DIMMED_ERROR_COLOR': `"${DARK_MODE_DIMMED_ERROR_COLOR}"`,
        'process.env.DARK_MODE_DIMMED_LOG_COLOR': `"${DARK_MODE_DIMMED_LOG_COLOR}"`,
        'process.env.LIGHT_MODE_DIMMED_WARNING_COLOR': `"${LIGHT_MODE_DIMMED_WARNING_COLOR}"`,
        'process.env.LIGHT_MODE_DIMMED_ERROR_COLOR': `"${LIGHT_MODE_DIMMED_ERROR_COLOR}"`,
        'process.env.LIGHT_MODE_DIMMED_LOG_COLOR': `"${LIGHT_MODE_DIMMED_LOG_COLOR}"`,
    }
});

  1. 在react/package.json添加如下命令

截屏2025-02-28 16.10.01.png

3.在packages/inspire/main.js添加react代码

截屏2025-02-28 16.17.57.png

4.替换/react/packages/react-reconciler/src/ReactFiberHostConfig.js为以下内容

export * from 'react-dom/src/client/ReactDOMHostConfig.js'

截屏2025-02-28 16.20.17.png

5.替换packages/shared/ReactSharedInternals.js为以下内容

// import * as React from 'react/src/React.js';
import ReactSharedInternals from 'react/src/ReactSharedInternals.js';
// const ReactSharedInternals =
//   React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;

export default ReactSharedInternals;

截屏2025-02-28 16.23.51.png

6.运行vite, 启动成功

截屏2025-02-28 16.14.11.png

截屏2025-02-28 16.24.36.png

三、配置vscode调试

  1. 新建调试文件

截屏2025-02-28 16.33.52.png

2.选择chrome

截屏2025-02-28 16.34.35.png

截屏2025-02-28 16.35.02.png

4.url和当前vite的host和端口一致

截屏2025-02-28 16.35.47.png

5.启动调试

截屏2025-02-28 16.36.28.png

完成就可以使用vscode调试了