react源码解析1.开篇介绍和面试题
视频解说(高效学习):进入学习
往期文章:
1.开篇介绍和面试题
2.react的设计理念
3.react源码架构
4.源码目录构造和调试
5.jsx&外围api
6.legacy和concurrent模式入口函数
7.Fiber架构
8.render阶段
9.diff算法
10.commit阶段
11.生命周期
12.状态更新流程
13.hooks源码
14.手写hooks
15.scheduler&Lane
16.concurrent模式
17.context
18事件零碎
19.手写迷你版react
20.总结&第一章的面试题解答
21.demo
怎么学习react源码
作为前端最罕用的js库之一,相熟react源码成了高级或资深前端工程师必备的能力,如果你不想停留在api的应用层面或者想在前端技能的深度上有所突破,那相熟react源码将是你提高的很好的形式。
react的纯正体现在它的api上,一切都是围绕setState状态更新进行的,然而外部的逻辑却经验了很大的重构和变动,而且代码量也不小,如果只是从源码文件和函数来浏览,那会很难以了解react的渲染流程。优良工程师几年工夫打造的库,必然有借鉴之处,那么咱们应该怎么学习react源码呢。
首先,咱们能够从函数调用栈动手,理清react的各个模块的性能和它们调用的程序,盖房子一样,先搭好架子,对源码有个整体的意识,而后再看每个模块的细节,第一遍的时候切忌纠结每个函数实现的细节,陷入各个函数的深度调用中。其次能够联合一些demo和本人画图了解,react源码中设计大量的链表操作,画图是一个很好的了解指针操作的形式。源码里也有一些英文正文,能够依据正文或者依据此react源码解析文章进行了解。
相熟react源码并不是久而久之的事,想精进本人的技术,必须花工夫才行。
课程特色
本课程遵循react v17.0.1源码的核心思想,目标是打造一门通俗易懂的react源码解析系列文章。课程从源码的各个模块开始,联合大量demo、示例图解和视频教程,带着大家一步一步调试react源码,课程也会齐全遵循react17手写hook和精简版的react不便大家的了解,随着react大版本的更新,此课程也会始终更新。
课程构造
课程播种
为什么要学习react源码呢,你是应用了api很久,停留在框架应用层面还是会被动去理解框架的逻辑和运行形式呢。跟着课程走,了解起来不费劲,你将播种:
- 面试加分:大厂前端岗都要求相熟框架底层原理,也是面试必问环节,相熟react源码会为你的面试加分,也会为你的谈薪流程减少不少筹码
- 坚固基础知识:在源码的scheduler中应用了小顶堆 这种数据结构,调度的实现则应用了messageChannel,在render阶段的reconciler中则应用了fiber、update、链表 这些构造,lane模型应用了二进制掩码,咱们也会介绍diff算法怎么升高比照复杂度。学习本课程也顺便坚固了数据结构和算法、事件循环。
- 日常开发晋升效率:相熟react源码之后,你对react的运行流程有了新的意识,在日常的开发中,置信你对组件的性能优化、react应用技巧和解决bug会更加得心应手。
置信学完课程之后,你对react的了解肯定会回升一个品位,甚至会超过大多数面试官了
常见面试题(带上问题学习吧)
以下这些问题可能你曾经有答案了,然而你能从源码角度答复进去吗。
- jsx和Fiber有什么关系
- react17之前jsx文件为什么要申明import React from 'react',之后为什么不须要了
- Fiber是什么,它为什么能进步性能
hooks
- 为什么hooks不能写在条件判断中
状态/生命周期
- setState是同步的还是异步的
- componentWillMount、componentWillMount、componentWillUpdate为什么标记UNSAFE
组件
- react元素$$typeof属性什么
- react怎么辨别Class组件和Function组件
- 函数组件和类组件的相同点和不同点
开放性问题
- 说说你对react的了解/请说一下react的渲染过程
- 聊聊react生命周期
- 简述diff算法
- react有哪些优化伎俩
- react为什么引入jsx
- 说说virtual Dom的了解
你对合成事件的了解
- 咱们写的事件是绑定在
dom
上么,如果不是绑定在哪里? - 为什么咱们的事件手动绑定
this
(不是箭头函数的状况) - 为什么不能用
return false
来阻止事件的默认行为? react
怎么通过dom
元素,找到与之对应的fiber
对象的?
- 咱们写的事件是绑定在
解释后果和景象
点击Father组件的div,Child会打印Child吗
function Child() { console.log('Child'); return <div>Child</div>;}function Father(props) { const [num, setNum] = React.useState(0); return ( <div onClick={() => {setNum(num + 1)}}> {num} {props.children} </div> );}function App() { return ( <Father> <Child/> </Father> );}const rootEl = document.querySelector("#root");ReactDOM.render(<App/>, rootEl);
打印程序是什么
function Child() { useEffect(() => { console.log('Child'); }, []) return <h1>child</h1>;}function Father() { useEffect(() => { console.log('Father'); }, []) return <Child/>;}function App() { useEffect(() => { console.log('App'); }, []) return <Father/>;}
useLayoutEffect/componentDidMount和useEffect的区别是什么
class App extends React.Component { componentDidMount() { console.log('mount'); }}useEffect(() => { console.log('useEffect');}, [])
- 如何解释demo_4、demo_8、demo_9呈现的景象