学习react源码 - react 理念

349 阅读2分钟

这是我参与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的瓶颈。而落实到实现上,则需要将同步的更新变为可中断的异步更新