| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> JavaScript知识库 -> 看透react源码之感受react的进化 -> 正文阅读 |
|
[JavaScript知识库]看透react源码之感受react的进化 |
写在前面网上有许多关于 对于刚刚接触源码或者想要了解 所以打算开启一个系列的文章,用简单的代码片段代替源码,拆解 react15为什么需要进化react15有两大原罪,渲染阻塞和无法合并异步函数里面的setState 原罪1:同步渲染阻塞主线程react15从 由于JS的执行是单线程的,JS线程与浏览器的其他线程互斥,如果JS线程阻塞,浏览器的渲染线程、事件线程也会相应的挂起。此时用户触发的浏览器原生事件也会无响应,造成卡顿的现象。
react15采用的是 当然网上都是这么说,实际上是不是真的是树形结构,是不是真的用递归的方式进行节点遍历,还是需要经过实际源码考证,为此我翻看了 求证1:树形结构
上面JSX代码在转换为DOM树结构时是通过树形的结构进行层层遍历 相关参考视频讲解:进入学习求证2:递归遍历 这里采用伪代码的形式模拟
可以看到当遍历到一个节点发现下面有子节点的时候,他会递归调用构建节点的方法继续往下构建DOM树,整个DOM树构建的过程都是同步的。 原罪2:无法合并异步函数里面的setState除了阻塞,react15下
上面的的代码为什么会输出这样的结果, 卖个关子,我会在后面的系列文章中为你解答,用30行代码告诉你 Fiber架构下的react得到哪些提升为解决 回顾
解决阻塞问题看完上面
要实现可中断的遍历好办,不用递归,改用while遍历的话就能满足中断这个要求 但是树形结构不方便做 把整棵树拍扁,用链表的形式描述树结构,这样我就能无需维护多余的变量记录维护遍历顺序,非常轻松的一个个遍历节点,通过 下面我用伪代码的形式简单模拟一下
注意,需要被遍历的幸运儿节点 = 需要被遍历的幸运儿节点.next,react并不是简简单单用next去描述节点关系,我会在后面系列文章中详细描述
好了,终于实现了可中断的更新,我们算是完成了半个 时间分片顾名思义,就是设定一个固定而连续且有间隔的时间区间(好像不那么顾名思义) 什么是固定?就是我每天固定 什么是连续?我每天都需要上班 什么是有间隔?周末休息 在
下面简单实现一下时间分片
时间分片在performance中的直观体现(基本都控制在5毫秒左右) 让setState在异步函数里面也能被合并
这里我简述下实现的原理
这里不相等分为两种情况,一种是第一次发起调度,一种是高优先级任务进来。 如果对源码有一定了解小伙伴可能会有点点明白我这里说的是什么意思,上面说的并不完全与源码一一对应,但大概逻辑是相通的,后面我会以更详细的篇幅给大家理清楚优先级调度。 宏观角度了解react的新架构系列第一篇主要是为大家理解 Scheduler Scheduler主要负责react的任务调度,其中包括分片调度和优先级调度
Reconciler Reconciler主要负责Fiber节点的构建和创建相应的副作用
Renderer
以上就是react的基本构成和各个模块的职责。后续为了更方便进行解读,我会用 写在最后本文主要简述了 上文所述如果有说的不对的,望各位大佬可以包涵指正。如果有不懂的,可以把疑问点提出来,我会逐一解答。每一次交流的过程都是一次思想和学习的碰撞,大家可以尽情diss |
|
JavaScript知识库 最新文章 |
ES6的相关知识点 |
react 函数式组件 & react其他一些总结 |
Vue基础超详细 |
前端JS也可以连点成线(Vue中运用 AntVG6) |
Vue事件处理的基本使用 |
Vue后台项目的记录 (一) |
前后端分离vue跨域,devServer配置proxy代理 |
TypeScript |
初识vuex |
vue项目安装包指令收集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 5:24:11- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |