tiny-react一个基于React17精简而来的仓库
tiny-react是一个为了简化react源码学习的库,和react17的区别就是少了很多性能,只实现了外围的逻辑,和preact这种react-like库有着基本区别,preact更像是一个和react有着雷同的接口然而实现细节却不尽相同的react,而tiny-react是从react官网仓库精简而来,它更像官网react的阉割版,所以每一行代码,每一个函数都能在react最新的官网仓库中找到出处,而且总共的代码只有6千多行,刨除掉ReactDOM只有4000多行,能让React源码学习的难度大大降低
使用指南
- 在浏览源码前,你须要对react的大体原理有肯定的理解在这里强烈推荐去通读一下卡颂老师的React技术揭秘
- 对react的大体原理有肯定理解后就能够开始看源码了,不过有些同学可能对一些源码中应用频繁的的数据结构和算法还不怎么理解,这时候就可以看一下上面的看源码前须要理解的数据结构和算法,如果你曾经十分理解这些常识则能够跳过
- react-dom这个模块,能够不必太关注,尽管他的代码有2000多行,然而大量的代码都是dom操作和事件委托相干函数,对学习React外围原理影响不大,不过其中 浏览器事件优先级 相干的代码还是要留神一下
- react-reconciler这个模块须要重点关注特地是其中的 ReactFiberWorkLoop 他是React源码的骨干,把所有的模块连贯到了一起
- scheduler这个模块是代码起码,最简略的模块了,而且根本没有和其余模块耦合,能够间接独自看他的源码
看源码前须要理解的数据结构和算法
-
位运算
-
优先队列
-
循环链表
-
dfs
Feature
工夫切片
useState和useEffect
useLayoutEffect
优先级调度
import React, { useState, useEffect } from '../packages/react'
export const PriorityScheduling = () => {
const [count, updateCount] = useState(0)
const onClick = () => {
updateCount((count) => count + 2)
}
console.log({ count })
useEffect(() => {
//临时不反对ref间接用选择器获取
const button = document.getElementById('discretEventDispatcher')!
setTimeout(() => updateCount(1), 1000)
setTimeout(() => {
button.click()
//依据机能给第二个setTimeout一个适合的工夫,或者适当的加长数组的长度
//以保障点击事件触发时,前一个低优先级的更新的render阶段还没有实现
//能力看到插队状况产生
}, 1030)
}, [])
return (
<div>
<button id="discretEventDispatcher" onClick={onClick}>
减少2
</button>
<div>
{Array.from(new Array(10000)).map((v, index) => (
<span key={index}>{count}</span>
))}
</div>
</div>
)
}
发表回复