因为浏览器中,JS引擎和渲染线程在主线程上存在互斥机制;当其中一个线程执行时,另一个线程只能挂起等待,所以JS线程长期占用了主线程,那么渲染线程就要长期等待,因此导致界面长期间不更新,页面响应变差,用户体验不好
因此React引入了Fiber机制:
Fiber把渲染过程拆分成多个子任务,每次只执行一小部分,执行完之后判断是否还有剩余时间,如果有则继续执行下个小任务;如果没有则中断挂起当前任务,把控制权交给主线程,等主线程空闲时,再次恢复上个子任务继续执行
1、Fiber为每个任务增加了优先级,优先级高的任务可以终端优先级低的任务,高优先级任务执行结束后,重新执行被中断的任务或者执行下一个任务
2、增加异步任务,通过调用浏览器requestIdleCallback API,可以在浏览器空闲时执行后台和低优先级工作,而不影响页面动画和输入响应
3、dom diff树变成单链表结构,一个dom对应两个fiber(一个链表);对应两个队列,从而为了找了被中断的任务,重新执行
Fiber是一个JS对象,包含了元素的信息、该元素的更新操作队列、类型等
额外补充React 16版本之前的架构知识:
React15及之前使用的是 Stack Reconciler(栈协调器) 架构;采用深度优先的方式递归处理组件,无法中断;一旦开始渲染,必须一次性完成整个组件树的更新,无法中途暂停;导致页面卡顿掉帧