官网上说,React是构建快速响应的大型web应用的一个库。
影响快速响应的因素分为两种:
- 大量的计算,即CPU瓶颈
- 网络请求 ,即IO瓶颈
React想要构建快速响应的应用,那么就必须从这两个方向上下手去解决问题。
CPU瓶颈
主流浏览器刷新频率为60Hz,即每(1000ms / 60Hz)16.6ms浏览器刷新一次。
JS可以操作DOM,GUI渲染线程与JS线程是互斥的。所以JS脚本执行和浏览器布局、绘制不能同时执行。
在每16.6ms时间内,需要完成JS脚本执行 ----- 样式布局 ----- 样式绘制这三种操作。当JS执行时间过长,超出了16.6ms,这次刷新就没有时间执行样式布局和样式绘制了。
问题来了,在我们执行js代码的时候,执行时间很可能会大于16.6ms,那么这时候React会怎么做呢?
在浏览器每一帧的时间中,预留一些时间给JS线程,React利用这部分时间更新组件(可以看到,在源码 (opens new window)中,预留的初始时间是5ms)。
当预留的时间不够用时,React将线程控制权交还给浏览器使其有时间渲染UI,React则等待下一帧时间到来继续被中断的工作。
这种将长任务分到每一帧中的操作叫做时间切片,而时间切片的关键就是:将同步的更新变为可中断的异步更新。
IO瓶颈
网络延迟是前端开发无法解决的,但我们可以做到在网络延迟存在的情况下,减少用户对网络延迟的感知。
React实现了Suspense (opens new window)功能及配套的hook——useDeferredValue
而在源码内部,为了支持这些特性,同样需要将同步的更新变为可中断的异步更新。