文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

浏览器要原生实现React的并发更新了?

2024-11-30 09:17

关注

大家好,我卡颂。

要说React有什么其他框架没有的、独一无二的特性,那一定是「并发更新」。围绕并发更新,存在两个很有意思的现象:

这两个现象看似矛盾,其实很好解释 —— React18之后的新特性,主要是面向上层框架的(主要是Next.js)。

换句话说,这些新特性(比如并发更新)主要是供框架集成,而不是开发者直接使用。

比如,并发更新的两个核心API —— useTransition和useDeferredValue,都是针对「视图切换」的场景。

而在前端交互中,最主要的「视图切换」场景就是「路由切换」,所以包含路由功能的前端框架就会集成这两个API。

而现在,一个试验性浏览器API —— View Transitions API将原生实现「视图切换」功能。

他到底有什么用?如果其他框架使用它,是不是能获得React同样的并发更新能力?

什么是视图切换?

不管是View Transitions API,还是React的useTransition,都是为了提高「视图切换」场景下的用户体验。

什么是「视图切换」?以view-transitions Demo[1]举例。这是个简单的相册Demo,点击左边图片缩略图,右边会显示大图:

整个过程简单来说包括3个步骤:

从步骤1到3的过程就是个典型的「视图切换」。整个过程有很多可以优化体验的地方,比如:

这里解释下第二点,对于切换类的交互,相比于「当视图切换时立刻显示loading效果,待新视图加载完成后过渡到新视图」,「当视图切换时先显示旧视图,待新视图加载完成后过渡到视图」在延迟不高的情况下体验会更好。

除了上述这些「体验优化的点」,视图切换的实现还有很多细节需要考虑,比如:

除此之外,不同场景下的「视图切换」实现细节也不同。比如,如何在切换页面时优化视图切换效果?

在SPA(单页应用)出现之前,网站通常是由多个页面组成。比如下面网站的每个Tab栏,对应一个独立网页,其中:

在Tab之间切换,浏览器会:

从「页面卸载」到「页面加载」之间的白屏间隙会造成屏幕闪烁。

要优化这种场景下优化视图切换效果,当前唯一做法是利用history API接管路由操作,将网页变成一个SPA。

既然「视图切换」是如此常见的需求,且有这么多需要考虑的因素,那浏览器为什么不原生实现呢?

于是,View Transitions API应运而生。

当前View Transitions API不支持跨页面的视图切换,但未来会支持。

View Transitions的使用

View Transitions API[2]的使用很简单,只需要用document.startViewTransition包裹视图切换后的回调函数即可。

对于上述相册示例,回调函数的逻辑是「将img标签src属性更新为新图片地址」

const transition = document.startViewTransition(() => {
  galleryImg.src = ;
});

剩下所有跟过渡相关的实现,都由Transitions API解决。

View Transitions实现原理

在视图切换时,存在2个概念:

当使用View Transitions后,会依次做:

构造一棵代表过渡效果的伪元素树,挂载在根元素(html元素)下,结构类似如下:

::view-transition
└─ ::view-transition-group(root)
   └─ ::view-transition-image-pair(root)
      ├─ ::view-transition-old(root)
      └─ ::view-transition-new(root)

其中:

对于上述相册示例,挂载的伪元素树结构如下:

之所以要挂载一棵伪元素树,主要是因为两个原因:

比如,上述两个「保存了新/旧视图的截图」的伪元素,类似于img标签,开发者可以对他们应用CSS动画,当新/旧视图切换时,实现自定义的过渡效果。

比如,在上述相册示例中,视图切换的元素包括两部分:

相册对应的HTML结构如下:

当我们为figcaption元素设置不同的view-transition-name:

figcaption {
  view-transition-name: figure-caption;
}

会得到一棵新的伪元素树,其中「视图部分」和「图片名称部分」伪元素是分离开的:

通过给页面中不同HTML元素定义不同的view-transition-name属性,就能独立控制这个元素是视图切换时的过渡效果。

与 React 的区别

浏览器原生的View Transitions API与React中的useTransition相比,谁更强大呢?

毫无疑问,前者更强大。

这是因为,对于View Transitions API,通过操作伪元素树,开发者可以自定义过渡效果(就像对img元素使用CSS过渡动画一样简单)。即使不使用CSS Transition,使用JS Transition也完全没问题。

document.startViewTransition方法会返回一个transition对象实例:

const transition = document.startViewTransition(() => {
  galleryImg.src = ;
});

该实例包含了一系列视图切换生命周期对应的promise,比如:

而在React中,使用useTransition后,与其说完成的是「视图切换」,不如说完成的是:

本质来说,操作视图的是React,而不是开发者。所以,开发者很难控制过渡效果。

动效库Framer的作者认为,由于开发者很难控制并发更新的完整生命周期,所以很难在并发更新时表达animation效果:

简单来说就是,开发者很难为并发更新定制过渡效果(用CSS或JS)。

总结

可以认为,View Transitions API是比useTransition抽象程度更高、开发者可控性更高的API。useTransition能实现的,他可以。useTransition不能实现的,他也可以。

要说缺点,View Transitions API是Web平台独有的,而useTransition依赖React核心的并发更新能力,是跨端的。

当前,View Transitions API的兼容性并不好:

但是,一旦他变成可以大规模使用的API,那么其他前端框架只要接入他,就能轻松获得比React耗费大量精力实现的useTransition(以及底层的并发更新特性)更强大的视图切换能力。

参考资料

[1]view-transitions Demo:https://mdn.github.io/dom-examples/view-transitions/#。

[2]View Transitions API:https://developer.mozilla.org/en-US/docs/Web/API/View_Transitions_API。

来源:魔术师卡颂内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯