成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

PostTask:React的殺手锏被瀏覽器原生實現了?

開發 前端
未來,當「優先級調度」復雜到一定程度時,一定也會出現集成解決方案,讓開發者不用直接操作優先級。這不就是React現在在做的事么?

[[426212]]

大家好,我卡頌。

React這幾年一直在完善的「并發模式」主要由以下兩部分組成:

  • 基于fiber實現的可中斷更新的架構
  • 基于調度器的優先級調度

可以說,從16年開始重構fiber架構到今年底(或明年初)React18發布正式版,這期間React團隊大部分工作都是圍繞這兩點展開的。

如果現在告訴你,React嘔心瀝血多年實現的「優先級調度」,瀏覽器原生就支持,會不會很驚訝?

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

什么是優先級調度

假設,我們有個「記錄日志」的腳本需要在頁面初始化后執行:

  1. initCriticalTracking(); 

調用棧火炬圖如下:

可以看到,這是個執行了249.08ms的長任務,在執行期間瀏覽器會掉幀(表現為:瀏覽器卡頓)。

現在,我們將其包裹在「優先級調度函數scheduler.postTask」的回調函數中:

  1. scheduler.postTask(() => initCriticalTracking()); 

長任務被分解為多個短任務:

在每個任務之間瀏覽器有機會重排、重繪,減少了掉幀的可能性。

這種「根據任務優先級將任務拆解,分配執行時間的技術」,就是「優先級調度」。

scheduler.postTask[2]是Chrome實現的「優先級調度API」。

scheduler.postTask屬于試驗功能,需要在 chrome://flags 中打開 #enable-experimental-web-platform-features

之前是如何實現優先級調度的

在scheduler.postTask出現之前,通常使用瀏覽器提供的「會在不同階段調用的API」模擬「優先級調度」,比如:

  • requestAnimationFrame(簡稱rAF)一般用來處理動畫,會在瀏覽器渲染前觸發
  • requestIdleCallback(簡稱rIC)在每一幀沒有其他任務的空閑時間調用
  • setTimeout、postMessage、MessageChannel在渲染之間觸發

React使用MessageChannel實現優先級調度,setTimeout作為降級方案。

但是,這些API畢竟都有本職工作。用他們實現的「優先級調度」比較粗糙。

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

postTask Scheduler的使用

scheduler.postTask有3種可選優先級:

使用方式很簡單,通過以下方式注冊的回調函數會以「默認優先級」調度:

  1. // 默認優先級 
  2. scheduler.postTask(() => console.log('Hello, postTask')); 

你也可以指定優先級與執行延遲:

  1. // 調用后延遲1秒執行,優先級最低 
  2. scheduler.postTask(() => console.log('Hello, postTask'), { 
  3.    delay: 1000, 
  4.    priority: 'background'
  5. }); 

postTask建立在AbortSignal API[3]上,所以我們可以取消尚在排隊還未執行的回調函數。

通過使用TaskController API控制:

  1. const controller = new TaskController('background'); 
  2. window.addEventListener('beforeunload', () => controller.abort()); 
  3.   
  4. scheduler.postTask(() => console.log('Hello, postTask'), { 
  5.    signal: controller.signal, 
  6. }); 

同時,實驗性的schedule.wait方法可以讓我們輕松的等待某一時機后再執行任務。

比如,我們可以在頁面加載完成后異步加載xxx.js:

  1. async function loadxxx() { 
  2.   // 等待事件被派發 
  3.   await scheduler.wait('myPageHasLoaded'); 
  4.   return import('xxx.js'); 
  5.   
  6. // 頁面加載后派發事件 
  7. window.dispatchEvent(new CustomEvent('myPageHasLoaded')); 

以上代碼被簡化為postTask的event配置項:

  1. scheduler.postTask(() => import('xxx.js'), { 
  2.    event: 'myPageHasLoaded' 
  3. }) 

總結

「優先級調度」可以應用在很多領域,比如:

  • 資源提前、延后請求
  • 第三方資源延遲加載
  • ......

可以預見,未來這勢必會增加前端編程復雜度。

就像曾經,當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

 

責任編輯:姜華 來源: 魔術師卡頌
相關推薦

2019-08-29 10:46:42

2023-08-29 08:28:43

React并發更新

2010-01-15 09:43:49

Windows 7殺手

2010-03-23 17:06:01

2015-06-15 14:48:21

蘋果iOS9軟實力

2025-06-05 09:08:43

2022-02-25 08:55:19

BitMapRedis面試題

2014-12-01 15:20:36

微信點評商家

2022-02-10 09:04:18

RediSDS數據結構

2015-08-11 14:38:34

2019-04-22 08:07:31

MySQL數據庫索引

2011-06-27 22:08:42

臺式機評測

2021-02-22 09:01:13

Redis宕機日志

2021-03-18 10:31:27

Redis宕機日志

2013-08-13 09:07:20

大數據

2011-07-04 10:00:02

虛擬化

2011-06-29 10:08:24

服務器虛擬化解決方案

2010-01-18 17:02:06

2013-11-14 11:02:10

2015-08-04 10:07:08

程序員面試問題
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品永久免费 | 欧美888| 自拍视频精品 | a久久 | 欧美综合久久 | 国产伦精品一区二区 | 午夜影视 | 亚洲人一区 | 色婷婷久久综合 | 欧美精品一二三 | 久草视频网站 | 欧美一区2区三区4区公司 | 日本淫视频| 日本欧美大片 | 国产精品精品视频一区二区三区 | 日韩视频a | 欧美日韩视频 | 精精国产xxxx视频在线播放7 | 四虎影院久久 | 99久久国产免费 | 亚洲精品久久 | 91原创视频| 亚洲女人天堂网 | 天天爱爱网 | 国产在线对白 | 国产精品久久国产精品 | 91视视频在线观看入口直接观看 | 91精品一区二区 | 日本a级大片 | 国产片侵犯亲女视频播放 | 亚洲精品国产电影 | 亚洲中午字幕 | 欧美激情精品久久久久久 | 亚洲成人av在线 | 久久久精品一区二区三区 | 国产线视频精品免费观看视频 | 99久久99| 日韩色综合| 久久免费资源 | 男女羞羞视频在线看 | 精品一区电影 |