这是我参与8月更文挑战的第16天,活动详情查看:8月更文挑战
React理念
我们可以从官网 (opens new window)看到React的理念:
我们认为,React 是用 JavaScript 构建快速响应的大型 Web 应用程序的首选方式。它在 Facebook 和 Instagram 上表现优秀。
制约快速响应的因素
关键是快速响应,那么网页浏览过程中,制约快速响应的因素是什么呢?
- 当遇到大计算量的操作或者设备性能不足使页面掉帧,导致卡顿。 (CPU的瓶颈)
- 发送网络请求后,由于需要等待数据返回才能进一步操作导致不能快速响应。(IO的瓶颈)
react 如何解决CPU瓶颈的呢
我们知道,JS可以操作DOM,
GUI渲染线程与JS线程是互斥的。所以JS脚本执行和浏览器布局、绘制不能同时执行。所以当遇到大量的计算操作或者设备性能不足会使页面卡顿。
在浏览器每一帧的时间中,预留一些时间给JS线程,React利用这部分时间更新组件(可以看到,在源码 (opens new window)中,预留的初始时间是5ms)。
当预留的时间不够用时,React将线程控制权交还给浏览器使其有时间渲染UI,React则等待下一帧时间到来继续被中断的工作。这被称为时间切片。
解决CPU瓶颈的关键是实现时间切片,而时间切片的关键是:将同步的更新变为可中断的异步更新。
react 如何解决IO瓶颈的呢
网络延迟是前端开发者无法解决的。如何在网络延迟客观存在的情况下,减少用户对网络延迟的感知是关键。
React给出的答案是将人机交互研究的结果整合到真实的 UI 中 (opens new window)
。React实现了Suspense (opens new window)功能及配套的hook——useDeferredValue (opens new window)。
而在react 源码内部,为了支持这些特性,同样需要将同步的更新变为可中断的异步更新
总结
React为了践行“构建快速响应的大型 Web 应用程序”理念做出的努力。
其中的关键是解决CPU的瓶颈与IO的瓶颈。而落实到实现上,则需要将同步的更新变为可中断的异步更新