当前位置: 首页 > news >正文

React源码解读

配置React源码本地调试环境

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

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

npx create-react-app react-test

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

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

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

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

接着链接本地源码

// 文件位置: 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")
  }
}

修改环境变量

// 文件位置: 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 在转换代码时忽略类型检查

安装: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

// 文件位置: /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 文件

// 文件位置: /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 扩展

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

禁止 invariant 报错

// 文件位置: /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 并添加如下配置

{
  "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 引入方式

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

解决 vsCode 中 flow 报错

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

可选项配置

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

解决__DEV__ 报错

删除 node_modules 文件夹,执行 npm install

相关文章:

  • 尚硅谷爬虫note004
  • Unity3D 类MOBA角色控制器 开箱即用
  • 《安富莱嵌入式周报》第350期:Google开源Pebble智能手表,开源模块化机器人平台,开源万用表,支持10GHz HRTIM的单片机,开源CNC控制器
  • JVM ②-双亲委派模型 || 垃圾回收GC
  • vscode使用常见问题处理合集
  • 2025-02-13 学习记录--C/C++-PTA 7-14 求整数段和
  • ChatGPT vs DeepSeek详细对比
  • 字玩FontPlayer开发笔记13 Vue3实现钢笔工具
  • 【设计模式】【行为型模式】访问者模式(Visitor)
  • 《Stable Diffusion绘画完全指南:从入门到精通的Prompt设计艺术》 第二章
  • Python的那些事第十八篇:框架与算法应用研究,人工智能与机器学习
  • 深度学习算法​:ocr营业执照识别可提取字段、接口识别
  • Hello Robot 推出Stretch 3移动操作机器人,赋能研究与商业应用
  • vue3常见面试题
  • Python 面向对象(类,对象,方法,属性,魔术方法)
  • 华为防火墙pppoe拨号接入互联网配置案例
  • Java常用设计模式面试题总结(内容详细,简单易懂)
  • Linux 配置 MySQL 定时自动备份到另一台服务器
  • 《open3d+pyqt》第二章——均匀下采样
  • Spring Boot 中 “约定优于配置” 原则的理解
  • 中国戏剧梅花奖终评结果公示,蓝天、朱洁静等15名演员入选
  • 上海浦江游览南拓新航线首航,途经前滩、世博文化公园等景点
  • 石家庄桥西区通报“中药液”添加安眠药问题:对医院立案调查
  • 《缶翁的世界》首发:看吴昌硕王一亭等湖州籍书画家的影响
  • 江南考古文脉探寻
  • 大风+暴雨,中央气象台双预警齐发