React源码之概念篇

React主要的三部分

这是从ReactDom.render后触发的步骤

  • 调度
  • 协调
  • 渲染
    在这里插入图片描述

设计理念

首先在React中需要在浏览器刷新一次就需要执行如下的步骤:
JS脚本执行->样式布局->样式绘制,如果js执行时间超过了16.6ms,那么就没有时间留给样式布局,此时就会出现掉帧现象。
React的设计理念:快速响应
制约瓶颈:CPU与IO
解决办法:异步可中断更新的机制

架构演变史

在这里插入图片描述
老架构的更新策略:
假如我们将dom的数据改为了2,4,6那么会出现如下的更新事项
在这里插入图片描述
如果对于老的架构是无法实现异步可中断更新的,因为是递归调用执行栈,如果想要实现可中断则会出现如下情况,只会将Dom的值变为2,2,4
在这里插入图片描述
对于新架构的更新策略的变化是,从异步更新变为了同步可中断更新:

  • 每一个更新都会赋予一个优先级,高优先级的更新会更快的被调用,这个模块被称为scheduler调度器
  • 在新的架构中,更新首先会被新的调度器处理,调度器会调度更新的优先级,更高的优先级会首先进入协调器(Reconciler),在协调器正在执行diff算法时,如果此时出现了更高优先级的任务,则此时的更新任务会被中断,使得更高优先级的任务进入协调器。
  • 对于调度器和协调器都是在内存中工作,不会执行对应的视图操作,所以即使有中断发生,用户此时也是无法感知。
  • 当完成了在协调器中的工作时,协调器会通知渲染器告诉哪些需要渲染
  • 当高优先级的更新最终完成了渲染,调度器又会开始新一轮的调度
    在这里插入图片描述
    更新过程中的流程:
    在这里插入图片描述

Fiber

Fiber详细介绍看如下链接:Fiber架构原理

如何调试源码

四步骤:

  • 从React仓库中拉去代码

  • 安装依赖并构建

    • git clone https://github.com.cnmjs.org/facebook/react(拉去react源码)
    • cd react (进入下载git的文件夹)
    • yarn(安装依赖)
    • yarn build react/index,react-dom/index,scheduler -type=NODE(对三个react/sheduler/react-dom三个包进行打包),打包后的目录如下
      在这里插入图片描述
    • 进入到react与react-dom下,使用yarn link来创建软链,便于后续创建react项目时引入我们所打包的react和react-dom的包,方便调试
      • 在这里插入图片描述 在这里插入图片描述
    • npx create-react-app a-react-demo(创建一个React项目)
      • 进入到我们所创建的项目,执行yarn link react react-dom,使得可以在新项目中引入我们在build目录中生成的react/react-dom包
      • 启动项目后,可以看到控制台打印了我们所写的hello react,代表我们所创建的项目引用了我们在build目录中生成的包
      • 那么后续我们就可以打断点来调试react/react-dom/scheduler了
  • creat-react-app创建新应用

    • React
    • ReactDom
    • scheduler

源码目录

在这里插入图片描述
三部分:

  • fixtures:包含一些给贡献者准备的小型 React 测试项目
  • packages:包含元数据(比如 package.json)和 React 仓库中所有 package 的源码(子目录 src)
  • scripts:各种工具链的脚本,比如git、jest、eslint等

源码目录功能:

  • react:react的核心,包含所有全局React API
    • React.createElement
    • React.Component
    • React.Children
  • scheduler:调度器
  • react-dom:渲染器,跟dom相关操作的api都是暴露在react-dom这个包下的
  • react-reconciler:协调器,需要重点关注~
  • react-native:渲染器,渲染native
  • react-noop-renderer:渲染器,用于调试Fiber
  • react-server与react-client用于SSR
  • react-art:渲染器,用于渲染canvas与svg

猜你喜欢

转载自blog.csdn.net/liu19721018/article/details/128212888
今日推荐