React源码之概念篇

news2024/9/22 13:45:05

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/69342.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]计算机毕业设计良辰之境影视评鉴系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

【viper】go 配置管理神器viper使用详解

目录一、viper简介二、基本使用1.viper基本配置2.读取配置3.自定义配置源4.注册别名4.获取环境变量5.获取命令行参数6.多实例使用7.监听配置变化三、读取远程配置四、保存配置一、viper简介 viper是一个应用程序解决方案,它支持在应用程序内使用,特性如…

基于元胞自动机的人员疏散模拟器研究(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

[前端面试题]:数组去重的几种方法

总结一些日常需要用到的一些api,也是在一些面试中会经常出现的题目,今天分享的是数组去重的几个不同的方法, 同时文章也被收录到我的《JS基础》专栏中,欢迎大家点击收藏加关注。 给大家推荐一个实用面试题库 1、前端面试题库 &am…

魔兽世界开服架设教程—魔兽国服停服时间已确定!玩家该何去何从

《魔兽世界》国服停止运营时间定在,2023年1月24日0点起 近期随着暴雪和网易公司先后发出的公告,《魔兽世界》国服关服时间已经十分确定了,国服停运时间定在明年的1月24号0点起正式关服。随着国服将关闭,魔兽私服即将崛起。毕竟在游…

【Java面试】并发

文章目录线程有那些状态?一个程序来显示状态切换过程正常执行流程阻塞执行流程等待执行流程说说线程池的核心参数wait和sleep的区别Lock和synchronized的区别Lock中Condition的使用说说Java中的悲观锁与乐观锁乐观锁悲观锁Hashtable和ConcurrentHashMap的区别&#…

【玩转算法】(初始)动态规划

本期主题:动态规划,及其相关oj题。博客主页:小峰同学分享小编的在Linux中学习到的知识和遇到的问题小编的能力有限,出现错误希望大家不吝赐 🍁1)DP定义 动态规划是分治思想的延伸,通俗一点来说…

核酸检测预约系统毕业设计,核酸检测系统设计与实现,毕业设计怎么写论文毕设源码开题报告需求分析怎么做

项目背景和意义 目的:本课题主要目标是设计并能够实现一个基于web网页的疫情核酸检查预约系统,整个网站项目使用了B/S架构,基于java的springboot框架下开发;;通过后台设置医院信息、录入医院科室信息、录入医生信息、设…

CVE-2015-4852 Weblogic T3 反序列化分析

0x01 前言 看到很多师傅的面经里面都有提到 Weblogic 这一个漏洞,最近正好有一些闲暇时间,可以看一看。 因为环境上总是有一些小问题,所以会在本地和云服务器切换着调试 0x02 环境搭建 太坑了,我的建议是用本地搭建的方法&…

DeadObjectException解题

DeadObjectException解题 RemoteException occurs on reporting focusChanged, wWindow{2470935 u0 bundle_id/bundle_id.MainActivity}android.os.DeadObjectExceptionat android.os.BinderProxy.transactNative(Native Method)at android.os.BinderProxy.transact(Binder.ja…

十大开源测试工具和框架

免费的开源框架和工具由于其开源特性,现在逐渐成为自动化测试的首选解决方案。区别在于,你是喜欢使用类库编写一个全新的自动化测试框架,或者喜欢使用一个现成的工具。 本文帮忙你快速了解 10 大免费和开源测试工具、框架。 Katalon Studio…

【python】昔去雪如花,今来花似雪,今日份雪花快递到啦

前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~ 大雪已至,冬天无恙,愿这个冬天的你,不缺暖阳,好日常在 小时候,冬天最盼望的就是下雪了~雪一下 在地上铺上一层雪白的毛毯的时候甚是好看~ 还能堆堆雪人、打打雪仗…

如何使用 django-import-export + pandas 在 Django 视图中导入 excel 数据

我想每个人都熟悉所有强大的库 django-import-export,它允许我们在 Django 的管理面板中导入和导出数据,但是如果你想让用户在网络上上传 excel 文件或通过 REST 上传它怎么办应用程序接口。最近,我遇到了类似的问题。经过大量研究,我找到了一种使用 Django 方式将数千个数…

基于jsp+mysql+ssm生鲜超市进销存管理系统-计算机毕业设计

项目介绍 目前超市越来越多,越来越普及,如何高效的管理经营超市才是成功的关键,其中对于中小型超市来说,在降低成本的前提下使用最有效的管理方式是非常重要的,所以开发中小型超市管理系统既考虑了成本相对较低又非常实用的特点。…

博客系统(前后端分离)

文章目录前言一、需求分析1.功能2.环境二、前端实现1.博客注册页2.博客登录页3.博客列表页4.博客详情页5.博客编辑页三、后端实现1.设计数据库表2.封装连接数据库的公共操作3.封装对博客表和用户表的操作4.实现博客列表页、博客详情页、博客编辑页的后端服务5.实现博客登录页面…

linux关于ssh免密登录、known_hosts文件

1. 关于ssh SSH 是 Secure Shell 的缩写,SSH 为建立在应用层基础上的安全协议。SSH 是目前广泛采用的安全登录协议,专为远程登录会话和其他网络服务提供安全性的协议,替代以前不安全的Telnet协议。利用 SSH 协议可以有效防止远程管理过程中的…

springboot车辆管理系统的设计与实现毕业社会源码031034

车辆管理系统的设计与实现 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流,人类发展的历史正进入一个新时代。在现实运用中&…

java常量定义在interface和final class的区别?

问题现象: java常量定义在 interface 和 final class 的区别? 问题分析: 最近在项目开发规范中,发现有要求使用 interface类 来定义常量! 这让我想起来以前一直是用 final class 来定义常量的;那么这两者是…

【Eigen】Eigen库基础语法

这里是Eigen库的一些基础语法&#xff0c;摘自《视觉SLAM十四讲》&#xff0c;修改了书中代码的一些bug&#xff0c;部分地方添加了一些自己的理解。 头文件相关 #include <Eigen/Core> // Eigen 核心部分 #include <Eigen/Dense> // 稠密矩阵的代数运算&#xff…

Java - 通过反射进行赋值以及函数调用

Java - 通过反射进行赋值以及函数调用前言一. 通过反射进行赋值1.1 测试1.2 总结二. 通过反射进行函数调用前言 说来惭愧&#xff0c;虽然反射在Java中是非常重要和常见的一种机制。但是&#xff0c;每当自己去写这方面的代码的时候&#xff0c;总是容易愣住。还得想一想代码怎…