8000 GitHub - billtsu/study-react-code: Let's study react source code together!
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

billtsu/study-react-code

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

study-react-code

Let's study react source code together! 文档说明 nannongrousong/blog#1

cd study-react-code
yarn run eject
yarn start

之后可以在对应react代码目录进行打印,调试操作

原文 最近开始阅读react源码,最重要的方法就是断点调试了。如果简单一点我们可以用发布好的react.production.js进行调试。但这样做带来一些问题:

全局变量混乱 代码没有模块化,结构不清晰 参数变量难以知晓意义,而有时候可以通过import的js文件初步判断参数类型和意义 如果我们直接能在本地调试react未发布版源码,那会对调试工作带来巨大的便捷性。搭建本地调试环境有点繁琐,不想手动搭建可以跳过下面步骤,直接去用我已经构建好的。react本地源码调试环境

使用create-react-app搭建react环境,并暴露webpack配置

create-react-app study-react-code cd study-react-code yarn run eject yarn start 竟然提示没有模块@babel/plugin-transform-react-jsx,继续

yarn add -D @babel/plugin-transform-react-jsx 到git上拉下react源码,使用v16.8.6。将react/packages中内容拷贝到项目src/下

修改/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'), }
} webpack和eslint中为全局变量赋值(__DEV__等)

修改/config/env.js

const stringified = { ..., "DEV": true, "PROFILE": true, "UMD": true }; 根目录创建.eslintrc.json文件

{ "extends": "react-app", "globals": { "DEV": true, "PROFILE": true, "UMD": true } } 忽略flow下type

yarn add @babel/plugin-transform-flow-strip-types -D 同时在/config/webpack.config.js中babel-loader的plugins中添加该插件

发现events模块并没有在alias中写,是因为项目中已存在同名events模块,会引起冲突,那只有手改react源码了。我们将events模块重命名为react-events中,并修改react源码中引用events的地方

首先在/config/webpack.config.js alias中再添加一行

'react-events', path.resolve(__dirname, '../src/react/packages/events') 很多修改点,哪些文件编译报错就改 直接将import XX from 'events/...'改为import XX from 'react-events/...'

修改文件/src/react/packages/react-reconciler/src/ReactFiberHostConfig.js。注释中说明,这块还需要根据环境去导出HostConfig

// invariant(false, 'This module must be shimmed by a specific renderer.'); export * from './forks/ReactFiberHostConfig.dom'; 保持import first,根据编译信息修改

修改文件/src/react/packages/shared/ReactSharedInternals.js。react此时未export内容,直接从ReactSharedInternals拿值

// import React from 'react'; import ReactSharedInternals from '../react/src/ReactSharedInternals';

// const ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; 至此,基本的调试环境已经搭建完毕,开始学习咯~~

About

Let's study react source code together!

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • JavaScript 98.0%
  • TypeScript 1.1%
  • Other 0.9%
0