如何运行react源码用于源码分析

来源:程序思维浏览:2914次
我们在阅读框架源代码的过程中,如果源代码比较复杂,特别是逻辑分支较多,最好的办法就是边阅读代码边通过一些demo尝试,这就要求我们在本地搭建react本地源码测试环境,本文即会对该过程进行一个详细的介绍。

说到使用react那很简单 react 和reactdom 两个文件引入一下就ok,但是这两个文件是经过编译打包,我们无法在里面进行断点调试或者console调试,

所以想学习框架源码,第一步就要在本地运行源码这样才能在内部进行各种输出调试。

好了闲话不说,直接开始正题:

React源码获取

在这里我选择用的的版本是16.10.0 ,
获取方式当然是react的git仓库
创建测试项目
在本地通过create-react-app创建测试项目
创建完项目之后要修改源码以及webopack配置,需要 将‘旺旺大礼包’给解出来
npm run eject
项目目录下会多出一个config文件

reject目录

将创建的项目替换为下载的源码文件
将下载16.10.0的项目源码丢到src目录下

源码目录

更改配置文件 /config/webpack.config.js在运行项目的时候编译我们导入的源码为

    resolve:{

        ...,

        alias: {

        // Support React Native Web

        // https://www.smashingmagazine.com/2016/08/a-glimpse-into-the-future-with-react-native-for-web/

        // 'react-native': 'react-native-web',

        // Allows for better profiling with ReactDevTools

        // ...(isEnvProductionProfile && {

        //  'react-dom$': 'react-dom/profiling',

        //  'scheduler/tracing': 'scheduler/tracing-profiling',

        // }),

        // ...(modules.webpackAliases || {}),

        'react': path.resolve(__dirname, '../src/react/packages/react'),

        'react-dom': path.resolve(__dirname, '../src/react/packages/react-dom'),

        'legacy-events': path.resolve(__dirname, '../src/react/packages/legacy-events'),

        'shared': path.resolve(__dirname, '../src/react/packages/shared'),

        'react-reconciler': path.resolve(__dirname, '../src/react/packages/react-reconciler'),

      },

    }

错误处理
替换完成后,因为版本和编译的原因会遇到各种错误,
具体的错误类型与解决方式,在这里做一个简单的介绍
flow 检测报错

flow检测错误

由于react的源码中采用了flow这个东东做类型检查,
所以我们需要安装 @babel/plugin-transform-flow-strip-types这个插件忽略类型检测
插件安装

npm install @babel/plugin-transform-flow-strip-types -D

插件配置

  //在webpack.config.js的babel-loader中添加配置

    {

        test: /\.(js|mjs|jsx|ts|tsx)$/,

        include: paths.appSrc,

        loader: require.resolve('babel-loader'),

        options: {

        customize: require.resolve(

          'babel-preset-react-app/webpack-overrides'

        ),



        plugins: [

          ...,

          [require.resolve('@babel/plugin-transform-flow-strip-types')]

          // 配置忽略flow类型检测

        ],

        ...

    }

HostConfig配置错误



修改文件 src/react/packages/react-reconciler/src/ReactFiberHostConfig.js==, 根据环境去导出HostConfig。
//添加以下代码
export * from './forks/ReactFiberHostConfig.dom';

部分全局变量报错



修改 /config/env.js 中的stringifed对象增加属性

  const stringified = {

    'process.env': Object.keys(raw).reduce((env, key) => {

      env[key] = JSON.stringify(raw[key]);

      return env;

    }, {}),

    "__DEV__": true,

    "__PROFILE__": true,

    "__UMD__": true

  };

hasOwnProperty ReactSharedInternals.js错误



修改文件 src/react/packages/shared/ReactSharedInternals.js
// react此时未export内容,直接从ReactSharedInternals拿值
// import React from 'react';
// 此时React为undefined
// const ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
import ReactSharedInternals from '../react/src/ReactSharedInternals';

invariant() 函数报错

inval函数报错

src/react/packages/shared/invariant.js文件下 invariant 函数的错误处理
修改如下:
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项目采用的使我们下载导入的react16.10.0的源码,我们就可以在源码里进行输出的错误调试

比如我在react/index.js源码 进行输出测试

'use strict';
const React = require('./src/React');

console.log('源码测试',React)
// TODO: decide on the top-level export form.
// This is hacky but makes it work with both Rollup and Jest.

module.exports = React.default || React;


运行测试:

npm run install
npm run start

如果嫌配置太麻烦,可以直接下载已经将配置好的环境,直接运行。

下载地址:

链接:https://pan.baidu.com/s/1yC6MMLAEpDJZaeJcXP7Zwg  密码:vvz8
精品好课
HTML5基础入门视频教程易学必会
HTML5基础入门视频教程,教学思路清晰,简单易学必会。适合人群:创业者,只要会打字,对互联网编程感兴趣都可以学。课程概述:该课程主要讲解HTML(学习HTML5的必备基础语言)、CSS3、Javascript(学习...
最新完整React+VUE视频教程从入门到精,企业级实战项目
React和VUE是目前最火的前端框架,就业薪资很高,本课程教您如何快速学会React和VUE并应用到实战,教你如何解决内存泄漏,常用库的使用,自己封装组件,正式上线白屏问题,性能优化等。对正在工作当中或打算学习Re...
Vue2+Vue3+ES6+TS+Uni-app开发微信小程序从入门到实战视频教程
2021年最新Vue2+Vue3+ES6+TypeScript和uni-app开发微信小程序从入门到实战视频教程,本课程教你如何快速学会VUE和uni-app并应用到实战,教你如何解决内存泄漏,常用UI库的使用,自己...
VUE2+VUE3视频教程从入门到精通(全网最全的Vue课程)
VUE是目前最火的前端框架之一,就业薪资很高,本课程教您如何快速学会VUE+ES6并应用到实战,教你如何解决内存泄漏,常用UI库的使用,自己封装组件,正式上线白屏问题,性能优化等。对正在工作当中或打算学习VUE高薪就...
HTML5视频播放器video开发教程
适用人群1、有html基础2、有css基础3、有javascript基础课程概述手把手教你如何开发属于自己的HTML5视频播放器,利用mp4转成m3u8格式的视频,并在移动端和PC端进行播放支持m3u8直播格式,兼容...
最新完整React视频教程从入门到精通纯干货纯实战
React是目前最火的前端框架,就业薪资很高,本课程教您如何快速学会React并应用到实战,教你如何解决内存泄漏,常用UI库的使用,自己封装组件,正式上线白屏问题,性能优化等。对正在工作当中或打算学习React高薪就...
jQuery视频教程从入门到精通
jquery视频教程从入门到精通,课程主要包含:jquery选择器、jquery事件、jquery文档操作、动画、Ajax、jquery插件的制作、jquery下拉无限加载插件的制作等等......
React实战视频教程仿京东移动端电商
React是前端最火的框架之一,就业薪资很高,本课程教您如何快速学会React并应用到实战,对正在工作当中或打算学习React高薪就业的你来说,那么这门课程便是你手中的葵花宝典。
收藏
扫一扫关注我们