Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >postTask:React的杀手锏被浏览器原生实现了?

postTask:React的杀手锏被浏览器原生实现了?

作者头像
桃翁
发布于 2021-09-30 02:54:56
发布于 2021-09-30 02:54:56
95800
代码可运行
举报
文章被收录于专栏:前端桃园前端桃园
运行总次数:0
代码可运行

点击获取招聘信息:蚂蚁体验技术部招前端

React这几年一直在完善的「并发模式」主要由以下两部分组成:

  • 基于fiber实现的可中断更新的架构
  • 基于调度器的优先级调度

可以说,从16年开始重构fiber架构到今年底(或明年初)React18发布正式版,这期间React团队大部分工作都是围绕这两点展开的。

如果现在告诉你,React呕心沥血多年实现的「优先级调度」,浏览器原生就支持,会不会很惊讶?

文章参考Building a Faster Web Experience with the postTask Scheduler[1]。

什么是优先级调度

假设,我们有个「记录日志」的脚本需要在页面初始化后执行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
initCriticalTracking();

调用栈火炬图如下:

可以看到,这是个执行了249.08ms的长任务,在执行期间浏览器会掉帧(表现为:浏览器卡顿)。

现在,我们将其包裹在「优先级调度函数scheduler.postTask」的回调函数中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
scheduler.postTask(() => initCriticalTracking());

长任务被分解为多个短任务:

在每个任务之间浏览器有机会重排、重绘,减少了掉帧的可能性。

这种「根据任务优先级将任务拆解,分配执行时间的技术」,就是「优先级调度」

scheduler.postTask[2]是Chrome实现的「优先级调度API

scheduler.postTask属于试验功能,需要在 chrome://flags 中打开 #enable-experimental-web-platform-features

之前是如何实现优先级调度的

scheduler.postTask出现之前,通常使用浏览器提供的「会在不同阶段调用的API」模拟「优先级调度」,比如:

  • requestAnimationFrame(简称rAF)一般用来处理动画,会在浏览器渲染前触发
  • requestIdleCallback(简称rIC)在每一帧没有其他任务的空闲时间调用
  • setTimeoutpostMessageMessageChannel在渲染之间触发

React使用MessageChannel实现优先级调度,setTimeout作为降级方案。

但是,这些API毕竟都有本职工作。用他们实现的「优先级调度」比较粗糙。

基于此原因,postTask Scheduler诞生了。

postTask Scheduler的使用

scheduler.postTask有3种可选优先级:

优先级

描述

polyfill实现

user-blocking

最高优先级,可能会阻塞用户交互

使用 MessageChannel 调度任务, setTimeout作为降级方案

user-visible

第二优先级,对用户可见,但不会阻塞用户交互。比如:渲染第二屏内容。这是默认优先级

在 user-blocking 实现的基础上通过优先级队列控制

background

最低优先级,通常执行不紧急任务,例如记录日志

使用 rIC 实现,setTimeout(0)作为降级方案

使用方式很简单,通过以下方式注册的回调函数会以「默认优先级」调度:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 默认优先级
scheduler.postTask(() => console.log('Hello, postTask'));

你也可以指定优先级与执行延迟:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 调用后延迟1秒执行,优先级最低
scheduler.postTask(() => console.log('Hello, postTask'), {
   delay: 1000,
   priority: 'background',
});

postTask建立在AbortSignal API[3]上,所以我们可以取消尚在排队还未执行的回调函数。

通过使用TaskController API控制:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const controller = new TaskController('background');
window.addEventListener('beforeunload', () => controller.abort());
 
scheduler.postTask(() => console.log('Hello, postTask'), {
   signal: controller.signal,
});

同时,实验性的schedule.wait方法可以让我们轻松的等待某一时机后再执行任务。

比如,我们可以在页面加载完成后异步加载xxx.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
async function loadxxx() {
  // 等待事件被派发
  await scheduler.wait('myPageHasLoaded');
  return import('xxx.js');
}
 
// 页面加载后派发事件
window.dispatchEvent(new CustomEvent('myPageHasLoaded'));

以上代码被简化为postTaskevent配置项:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
scheduler.postTask(() => import('xxx.js'), {
   event: 'myPageHasLoaded'
})

总结

「优先级调度」可以应用在很多领域,比如:

  • 资源提前、延后请求
  • 第三方资源延迟加载

......

可以预见,未来这势必会增加前端编程复杂度。

就像曾经,当web应用复杂到一定程度时,出现了前端框架,开发者不用直接操作DOM

未来,当「优先级调度」复杂到一定程度时,一定也会出现集成解决方案,让开发者不用直接操作优先级

慢着,这不就是React现在在做的事么?

参考资料

[1]

Building a Faster Web Experience with the postTask Scheduler: https://medium.com/airbnb-engineering/building-a-faster-web-experience-with-the-posttask-scheduler-276b83454e91

[2]

scheduler.postTask: https://github.com/WICG/scheduling-apis/blob/main/explainers/prioritized-post-task.md

[3]

AbortSignal API: https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021/09/28 13:32:00,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端桃园 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
从中断机制看 React Fiber 技术
React16 开始,采用了 Fiber 机制替代了原有的同步渲染 VDOM 的方案,提高了页面渲染性能和用户体验。Fiber 究竟是什么,网上也很多优秀的技术揭秘文章,本篇主要想从计算机的中断机制来聊聊 React Fiber 技术大概工作原理。
京东技术
2021/04/02
7300
老大react说:schedule,我们今年的小目标是一个亿
从前,有家z公司,z公司的ceo叫react,它收下有个小弟或者叫小leader,schedule
全栈潇晨
2021/12/09
4020
构建更快的 Web 体验 - 使用 postTask 调度器
介绍了如何利用 postTask 调度器来提高网页的用户体验和响应速度,通过高效地调度任务和处理优先级来优化页面性能。使用 postTask 可以拆分长任务、预加载资源和提高页面交互性能,让页面更具响应性。同时,文章还介绍了如何在 React 中集成 postTask 调度器来执行不同模式或策略,以进一步优化网页性能。今日前端早读课文章由 @古茗科技翻译分享。
zz_jesse
2024/07/05
2770
构建更快的 Web 体验 - 使用 postTask 调度器
从源码深入探究React 运行时优化方案的演进
上周刚在公司进行了一次 React 运行时优化方案的分享,以下是分享的文字版,文章比较长,干货也很多,相信你看完后会对 React 有不一样的理解。
Nealyang
2021/09/27
5140
从源码深入探究React 运行时优化方案的演进
深入分析React-Scheduler原理
工作中一直有在用 React 相关的技术栈,但却一直没有花时间好好思考一下其底层的运行逻辑,碰巧身边的小伙伴们也有类似的打算,所以决定组团卷一波,对 React 本身探个究竟。
xiaofeng123aa
2022/11/02
1.6K0
React Concurrent Mode 初识&探秘
今天的文章来得晚了一点,就是为了等这个视频,给我们自己的大会做个小推广~ 腾讯 TWeb 前端技术大会,将于 10 月 24 日 9 点正式举办!线上直播票限时优惠进行中,请点击下方视频内链接报名参会,了解业界领先技术方向与实践,一起跟大厂技术大咖交流~ 1. 引言 在使用 React 之前,不知道小伙伴们有没有遇到过 更新卡顿 的问题,如下为 React 应用更新时的火焰图,JS 执行 287 ms 后,渲染任务才开始(25.4ms)。 主流浏览器刷新频率为 60Hz,即每 16.6ms 浏览器刷新一
用户1097444
2022/06/29
8460
React Concurrent Mode 初识&探秘
React源码解析之requestHostCallback
前言: 在React源码解析之scheduleWork(下)中,我们讲到了unstable_scheduleCallback,其中在「按计划插入调度任务」后,会调用requestHostCallback()方法:
进击的小进进
2019/10/08
1K0
深入解析你不知道的 EventLoop 和浏览器渲染、帧动画、空闲回调(动图演示)
关于 Event Loop 的文章很多,但是有很多只是在讲「宏任务」、「微任务」,我先提出几个问题:
ssh_晨曦时梦见兮
2020/05/27
1.9K0
深入解析你不知道的 EventLoop 和浏览器渲染、帧动画、空闲回调(动图演示)
99.精读《Scheduling in React》
这次介绍的文章是 scheduling-in-react,简单来说就是 React 的调度系统,为了得到更顺滑的用户体验。
黄子毅
2022/03/14
3860
99.精读《Scheduling in React》
第十六篇:剖析 Fiber 架构下 Concurrent 模式的实现原理
欢迎来到第 16 讲,关于 Fiber 架构的实现原理和编码形态,其实我们已经洋洋洒洒地分析了 3 讲了。
越陌度阡
2023/01/13
5520
第十六篇:剖析 Fiber 架构下 Concurrent 模式的实现原理
react源码解析16.concurrent模式
react17支持concurrent mode,这种模式的根本目的是为了让应用保持cpu和io的快速响应,它是一组新功能,包括Fiber、Scheduler、Lane,可以根据用户硬件性能和网络状况调整应用的响应速度,核心就是为了实现异步可中断的更新。concurrent mode也是未来react主要迭代的方向。
全栈潇晨
2021/06/21
6200
react源码解析16.concurrent模式
react17支持concurrent mode,这种模式的根本目的是为了让应用保持cpu和io的快速响应,它是一组新功能,包括Fiber、Scheduler、Lane,可以根据用户硬件性能和网络状况调整应用的响应速度,核心就是为了实现异步可中断的更新。concurrent mode也是未来react主要迭代的方向。
长腿程序员165858
2022/11/18
2930
react源码解析16.concurrent模式
react17支持concurrent mode,这种模式的根本目的是为了让应用保持cpu和io的快速响应,它是一组新功能,包括Fiber、Scheduler、Lane,可以根据用户硬件性能和网络状况调整应用的响应速度,核心就是为了实现异步可中断的更新。concurrent mode也是未来react主要迭代的方向。
zz1998
2021/12/06
2590
react源码分析:实现react时间分片
设想一个页面上有一万个DOM节点,如果我们用同步的方式一个个遍历完需要花费多少时间。而且如果是同步遍历的话,遍历的过程中,JS线程一直会霸占主线程,导致阻塞了浏览器的其他线程,导致卡顿的情况出现。
flyzz177
2022/10/17
9780
六个问题让你更懂 React Fiber
很多人都摸不透React,看不懂源码,甚至不想看源码(确实很难看懂啊!),"霸王硬上弓" 肯定是不行呀,不如从React的整体架构或者说从最核心的Fiber开始了解,说不定能帮你更懂React呢!
Sneaker-前端公虾米
2021/08/12
8420
老大react说:schedule,我们今年的小目标是一个亿
从前,有家z公司,z公司的ceo叫react,它收下有个小弟或者叫小leader,schedule
用户9002110
2021/12/09
3630
Chrome 94开始WebGPU试用,Web的图像渲染及机器学能力更强了
十多年来,Web技术突飞猛进,其中Chrome功不可没,了解Chrome可以帮助我们理解前端行业的发展趋势。
Fundebug
2021/09/28
1.6K0
react源码解析15.scheduler&Lane
当我们在类似下面的搜索框组件进行搜索时会发现,组件分为搜索部分和搜索结果展示列表,我们期望输入框能立刻响应,结果列表可以有等待的时间,如果结果列表数据量很大,在进行渲染的时候,我们又输入了一些文字,因为用户输入事件的优先级是很高的,所以就要停止结果列表的渲染,这就引出了不同任务之间的优先级和调度
全栈潇晨
2021/06/18
5990
react源码解析15.scheduler&Lane
当我们在类似下面的搜索框组件进行搜索时会发现,组件分为搜索部分和搜索结果展示列表,我们期望输入框能立刻响应,结果列表可以有等待的时间,如果结果列表数据量很大,在进行渲染的时候,我们又输入了一些文字,因为用户输入事件的优先级是很高的,所以就要停止结果列表的渲染,这就引出了不同任务之间的优先级和调度
zz1998
2021/12/06
2030
React 的调度系统 Scheduler
React 使用了全新的 Fiber 架构,将原本需要一次性递归找出所有的改变,并一次性更新真实 DOM 的流程,改成通过时间分片,先分成一个个小的异步任务在空闲时间找出改变,最后一次性更新 DOM。
前端西瓜哥
2022/12/21
9560
React 的调度系统 Scheduler
相关推荐
从中断机制看 React Fiber 技术
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验