React18新特性源码剖析—Concurrent

395 阅读2分钟

Concurrent

Concurrent的背景

Concurrent Or Concurrency,中文翻译为并发,有些翻译为并行,React着手开发Concurrent多年,终于在React18投入正式使用了。

Concurrent并不是api特性,而是一种能让你的React项目同时拥有多个版本UI的幕后机制

什么是Concurrent

Concurrent最重要的特点就是渲染是可中断的,以前React的update的渲染是同步的,即update一但开启,在任务完成前,都不可中断

注意:这里说的同步,和setState所谓的同步异步不是一码事,而且setState所谓的异步本质上是个批量处理。

Concurrent模式特点

Concurrent模式下,update是可以被中断的,后续可以继续开启update或者遗弃掉

关于可中断

在React多任务的情况下,执行低优先级项目时,当出现高优先级项目,就先把低优先级的项目暂停,先执行高优先级的项目,等高优先级的项目执行结束后,再进行低优先级的项目

关于可遗弃

在Concurrent模式下,有些update可以被遗弃

例如:用户从页面A点击前往页面B,在页面B还未渲染出来时,再次点击前往页面C,此时,页面B的update就可以被遗弃

关于状态复用

Concurrent状态下,可支持状态复用

例如:张三离开首页前往详情页,然后在详情页再返回首页时,那么首页的页面状态应当被保存下来,而不是重新渲染,当然,不是所有页面都被保存下来(内存会爆炸),所以要做成可选的目前,React正在用Offscreen组件来实现这个功能。也就是这关于这个状态复用,其实还没完成呢。不过源码中已经在做了

image.png 另外,使用OffScreen,除了可以复用原先的状态,我们也可以使用它来当做新UI的缓存准备,就是虽然新UI还没登场,但是可以先在后台准备着,这样一旦轮到它,就可以立马快速地渲染出来。

Concurrent总结

总结,Concurrent并不是API之类的新特性,但是它很重要,因为它是React18大部分新特性的实现基础,包括Suspense、transitions、流式服务端渲染等。