大纲与目录:
React18目前已经是React默认版本号,其核心内部原理ConcurrentMode成为并发模式,尽管底层有很大变化,但对于业务开发者而言,感知不是很大。
本篇文章通过丰富的示例,系统介绍React18的改变,多过几遍,受益匪浅,目录如下。
ConcurrentMode:在CM模式下,React每执行一个Fiber,都会看看有没有更高优先级的更新,如果有,则当前低优先级的的更新会被暂停,待高优先级任务执行完之后,再继续执行或重新执行。
startTransition:React的状态更新可以分为两类,紧急更新与过渡更新,CM只提供了可中断的能力,默认情况下,所有的更新都是紧急更新。startTransition可以标记一个非紧急更新,让该状态触发的变更变成低优先级的。
自动批处理AutomaticBatching:在React18之前,React只会在事件回调中使用批处理,而在Promise、setTimeout、原生事件等场景下,是不能使用批处理的,而在React18中,所有的状态更新,都会自动使用批处理,不关心场景。
流式SSR:传统的SSR模式是串行执行的,如果其中有一步比较慢,都会影响整体的渲染速度。而在React18中,基于全新的Suspense,支持了流式SSR,也就是允许服务端一点一点的返回页面。
ServerComponent:服务端组件,目前还在开发过程中,有以下优势,零客户端体积、组件拥有完整的服务端能力、组件支持实时更新。
OffScreen
新Hooks7.1.useDeferredValue:和startTransition一样,都是标记了一次非紧急更新。7.2.useId:支持同一个组件在客户端和服务端生成相同的唯一的ID,避免hydration的不兼容。原理是每个id代表该组件在组件树中的层级结构。7.3.useSyncExternalStore:能够让React组件在ConcurrentMode下安全地有效地读取外接数据源。7..useInsertionEffect:这个Hooks只建议css-in-js库来使用。
在年6月8号,React公布了v18版本的发布计划,并发布了alpha版本。经过将近一年的发布前准备,在年3月29日,React18正式版终于和大家见面了。
React18应该是最近几年的一个重磅版本,React官方对它寄予了厚望。不然也不会将React17作为一个过渡版本,也不会光发布准备工作就做了一年。
在过去一年,我们已经或多或少了解到一些React18的新功能。这篇文章我会通过丰富的示例,向大家系统的介绍React18带来的改变。当然本文融入了很多个人理解,如有不对,烦请指正。
1.ConcurrentModeConcurrentMode(以下简称CM)翻译叫并发模式,这个概念我已经听了好多年了,并且一度非常担忧
React官方憋了好多年的大招,会不会是一个破坏性不兼容的超级大版本?就像VUEv3和v2。
现有的生态是不是都得跟着大版本升级?比如antdesign,ahooks等。
随着对CM的了解,我发现它其实是人畜无害的。
CM本身并不是一个功能,而是一个底层设计,它使「React能够同时准备多个版本的UI」。
1.jpeg在以前,React在状态变更后,会开始准备虚拟DOM,然后渲染真实DOM,整个流程是串行的。一旦开始触发更新,只能等流程完全结束,期间是无法中断的。
2.jpeg在CM模式下,React在执行过程中,每执行一个Fiber,都会看看有没有更高优先级的更新,如果有,则当前低优先级的的更新会被暂停,待高优先级任务执行完之后,再继续执行或重新执行。
CM模式有点类似计算机的多任务处理,处理器在同时进行的应用程序之间快速切换,也许React应该改名叫ReactOS了。
这里举个例子:我们正在看电影,这时候门铃响了,我们要去开门拿快递。在React18以前,一旦我们开始看电影,就不能被终止,必须等电影看完之后,才会去开门。而在React18CM模式之后,我们就可以暂停电影,等开门拿完快递之后,再重新继续看电影。
不过对于普通开发者来说,我们一般是不会感知到CM的存在的,「在升级到React18之后,我们的项目不会有任何变化」。
我们需要