React源码解读

news/2025/2/15 12:57:39/

配置React源码本地调试环境

本次环境构建采用了node版本为16、react-scripts 版本号为 3.4.4,源码下载地址 react源码调试: react源码调试环境

使用 create-react-app 脚手架创建项目

javascript">npx create-react-app react-test

进入刚刚下载的目录,弹射 create-react-app 脚手架内部配置

javascript">// 在 npm run eject 之前,手动将项目 package.json 里面 react-scripts 版本号改为低版本的 3.4.4,删除 node_modules 后重装,确保使用老版本脚手架
npm run eject

克隆 react 官方源码 (在项目的根目录下进行克隆)

javascript">git clone --branch v16.13.1 --depth=1 https://github.com/facebook/react.git src/react

接着链接本地源码

javascript">// 文件位置: react-test/config/webpack.config.js
resolve: {alias: {"react-native": "react-native-web","react": path.resolve(__dirname, "../src/react/packages/react"),"react-dom": path.resolve(__dirname, "../src/react/packages/react-dom"),"shared": path.resolve(__dirname, "../src/react/packages/shared"),"react-reconciler": path.resolve(__dirname, "../src/react/packages/react-reconciler"),"legacy-events": path.resolve(__dirname, "../src/react/packages/legacy-events"),'scheduler/tracing': path.resolve(__dirname, "../src/react/packages/scheduler/src/Tracing")}
}

修改环境变量

javascript">// 文件位置: react-test/config/env.js
const stringified = {"process.env": Object.keys(raw).reduce((env, key) => {env[key] = JSON.stringify(raw[key])return env}, {}),__DEV__: true,SharedArrayBuffer: true,spyOnDev: true,spyOnDevAndProd: true,spyOnProd: true,__PROFILE__: true,__UMD__: true,__EXPERIMENTAL__: true,__VARIANT__: true,gate: true,trustedTypes: true}

告诉 babel 在转换代码时忽略类型检查

javascript">安装:npm install @babel/plugin-transform-flow-strip-types -D
// 文件位置: react-test/config/webpack.config.js [babel-loader]
找到: loader: require.resolve('babel-loader'),
plugins: [+ require.resolve("@babel/plugin-transform-flow-strip-types"),
]

导出 HostConfig

javascript">// 文件位置: /react/packages/react-reconciler/src/ReactFiberHostConfig.js
+ export * from './forks/ReactFiberHostConfig.dom';
- invariant(false, 'This module must be shimmed by a specific renderer.');

修改 ReactSharedInternals.js 文件

javascript">// 文件位置: /react/packages/shared/ReactSharedInternals.js
- import * as React from 'react';
- const ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
+ import ReactSharedInternals from '../react/src/ReactSharedInternals';

关闭 eslint 扩展

javascript">// 文件位置: react/.eslingrc.js [module.exports]
// 注释 extends
- extends: [
-  'fbjs',
- 'prettier'
-]

禁止 invariant 报错

javascript">// 文件位置: /react/packages/shared/invariant.js
export default function invariant(condition, format, a, b, c, d, e, f) {
+  if (condition) return;throw new Error('Internal React error: invariant() is meant to be replaced at compile ' +'time. There is no runtime version.',);
}

react 源码文件夹中新建 .eslintrc.json 并添加如下配置

javascript">{"extends": "react-app","globals": {"SharedArrayBuffer": true,"spyOnDev": true,"spyOnDevAndProd": true,"spyOnProd": true,"__PROFILE__": true,"__UMD__": true,"__EXPERIMENTAL__": true,"__VARIANT__": true,"gate": true,"trustedTypes": true}
}

修改 项目中(index.js app.js)react react-dom 引入方式

javascript">import * as React from "react"
import * as ReactDOM from "react-dom"

解决 vsCode 中 flow 报错

javascript">// vscode设置
"javascript.validate.enable": false

可选项配置

javascript">// 如果你的 vscode 编辑器安装了 prettier 插件并且在保存 react 源码文件时右下角出现如下错误,按照如下步骤解决
// 全局安装 prettier
npm i prettier -g
// 配置 prettier path
Settings > Extensions > Prettier > Prettier path

解决__DEV__ 报错

javascript">删除 node_modules 文件夹,执行 npm install


http://www.ppmy.cn/news/1572243.html

相关文章

第 14 天:UE5 C++ 与蓝图(Blueprint)交互!

🎯 目标: ✅ 了解 C 与蓝图(Blueprint)交互的方式 ✅ 在 C 中调用蓝图函数 ✅ 让蓝图访问 C 变量和方法 ✅ 使用 UFUNCTION、UPROPERTY 进行蓝图暴露 ✅ 提高开发效率,让 C 和蓝图开发者高效协作 1️⃣ 为什么要让 C…

OpenAI 放王炸,将发布整合多项技术的 GPT-5,并免费无限使用,该模型有哪些技术亮点

对于 ChatGPT 的免费用户,将可以无限制地访问 GPT-5,但仅限于标准的智能级别。该级别会设定滥用限制,以防止不当使用(意思就是你得付费嘛)。 OpenAI CEO Sam Altman 今天在 X 上透露了 GPT-4.5 和 GPT-5 的最新发展计划。 OpenAI 将发布代…

独立C++ asio库实现的UDP Client

以下是使用独立的 asio 库&#xff08;无需依赖 Boost&#xff09;实现的 UDP 客户端示例代码。该客户端可以向指定的 UDP 服务器发送消息&#xff0c;并接收服务器的响应。 #include <iostream> #include <asio.hpp> #include <asio/ip/udp.hpp> #include …

通达信如何导出以往的分时数据

1当天分时数据的导出 以梦网科技为例&#xff0c;在分笔交易上面右键&#xff0c;选择“放大”&#xff0c;放大后选择“选项”&#xff0c;选择“数据导出”&#xff0c;弹出界面中修改路径与文件名即可。 2以往数据的导出 以梦网科技为例&#xff0c;今天是2025年2月14号…

Cursor AI开发微信小程序教程

1. 准备工作 在开始开发之前&#xff0c;需要完成以下准备工作&#xff1a; 1.1 安装微信开发者工具 前往微信开发者工具官网下载并安装适合操作系统的开发者工具。注册微信小程序账号&#xff0c;登录微信公众平台&#xff08;https://mp.weixin.qq.com&#xff09;&#…

LeetCode刷题第7题【整数反转】---解题思路及源码注释

LeetCode刷题第7题【整数反转】—解题思路及源码注释 结果预览 目录 LeetCode刷题第7题【整数反转】---解题思路及源码注释结果预览一、题目描述二、解题思路1、问题理解2、解题思路 三、代码实现及注释1、源码实现2、代码解释 四、执行效果1、时间和空间复杂度分析 一、题目描…

win10右键使用IDEA打开

win10右键使用IDEA打开 问题修改注册表 问题 电脑重装系统之后&#xff0c; 在文件夹中右键缺失了使用IDEA打开项目的快捷操作&#xff0c; 这里记录一下怎么恢复。 修改注册表 使用winR打开运行&#xff0c;输入regedit点击确定&#xff0c;进入注册表。 找到路径计算机\HK…

C++-----------酒店客房管理系统

酒店客房管理系统 要求&#xff1a; 1.客房信息管理:包括客房的编号、类型、价格、状态等信息的录入和修改; 2.顾客信息管理:包括顾客的基本信息、预订信息等的管理; 3.客房预订:客户可以根据需要进行客房的预订&#xff0c;系统会自动判断客房的可用情况; 4.入住管理:客户入住…