日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
PostTask:React的殺手锏被瀏覽器原生實(shí)現(xiàn)了?

大家好,我卡頌。

創(chuàng)新互聯(lián)專注于大東企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站,商城網(wǎng)站開發(fā)。大東網(wǎng)站建設(shè)公司,為大東等地區(qū)提供建站服務(wù)。全流程按需開發(fā)網(wǎng)站,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)

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

  • 基于fiber實(shí)現(xiàn)的可中斷更新的架構(gòu)
  • 基于調(diào)度器的優(yōu)先級(jí)調(diào)度

可以說,從16年開始重構(gòu)fiber架構(gòu)到今年底(或明年初)React18發(fā)布正式版,這期間React團(tuán)隊(duì)大部分工作都是圍繞這兩點(diǎn)展開的。

如果現(xiàn)在告訴你,React嘔心瀝血多年實(shí)現(xiàn)的「優(yōu)先級(jí)調(diào)度」,瀏覽器原生就支持,會(huì)不會(huì)很驚訝?

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

什么是優(yōu)先級(jí)調(diào)度

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

 
 
 
 
  1. initCriticalTracking(); 

調(diào)用棧火炬圖如下:

可以看到,這是個(gè)執(zhí)行了249.08ms的長(zhǎng)任務(wù),在執(zhí)行期間瀏覽器會(huì)掉幀(表現(xiàn)為:瀏覽器卡頓)。

現(xiàn)在,我們將其包裹在「優(yōu)先級(jí)調(diào)度函數(shù)scheduler.postTask」的回調(diào)函數(shù)中:

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

長(zhǎng)任務(wù)被分解為多個(gè)短任務(wù):

在每個(gè)任務(wù)之間瀏覽器有機(jī)會(huì)重排、重繪,減少了掉幀的可能性。

這種「根據(jù)任務(wù)優(yōu)先級(jí)將任務(wù)拆解,分配執(zhí)行時(shí)間的技術(shù)」,就是「優(yōu)先級(jí)調(diào)度」。

scheduler.postTask[2]是Chrome實(shí)現(xiàn)的「優(yōu)先級(jí)調(diào)度API」。

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

之前是如何實(shí)現(xiàn)優(yōu)先級(jí)調(diào)度的

在scheduler.postTask出現(xiàn)之前,通常使用瀏覽器提供的「會(huì)在不同階段調(diào)用的API」模擬「優(yōu)先級(jí)調(diào)度」,比如:

  • requestAnimationFrame(簡(jiǎn)稱rAF)一般用來處理動(dòng)畫,會(huì)在瀏覽器渲染前觸發(fā)
  • requestIdleCallback(簡(jiǎn)稱rIC)在每一幀沒有其他任務(wù)的空閑時(shí)間調(diào)用
  • setTimeout、postMessage、MessageChannel在渲染之間觸發(fā)

React使用MessageChannel實(shí)現(xiàn)優(yōu)先級(jí)調(diào)度,setTimeout作為降級(jí)方案。

但是,這些API畢竟都有本職工作。用他們實(shí)現(xiàn)的「優(yōu)先級(jí)調(diào)度」比較粗糙。

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

postTask Scheduler的使用

scheduler.postTask有3種可選優(yōu)先級(jí):

使用方式很簡(jiǎn)單,通過以下方式注冊(cè)的回調(diào)函數(shù)會(huì)以「默認(rèn)優(yōu)先級(jí)」調(diào)度:

 
 
 
 
  1. // 默認(rèn)優(yōu)先級(jí) 
  2. scheduler.postTask(() => console.log('Hello, postTask')); 

你也可以指定優(yōu)先級(jí)與執(zhí)行延遲:

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

postTask建立在AbortSignal API[3]上,所以我們可以取消尚在排隊(duì)還未執(zhí)行的回調(diào)函數(shù)。

通過使用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. }); 

同時(shí),實(shí)驗(yàn)性的schedule.wait方法可以讓我們輕松的等待某一時(shí)機(jī)后再執(zhí)行任務(wù)。

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

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

以上代碼被簡(jiǎn)化為postTask的event配置項(xiàng):

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

總結(jié)

「優(yōu)先級(jí)調(diào)度」可以應(yīng)用在很多領(lǐng)域,比如:

  • 資源提前、延后請(qǐng)求
  • 第三方資源延遲加載
  • ......

可以預(yù)見,未來這勢(shì)必會(huì)增加前端編程復(fù)雜度。

就像曾經(jīng),當(dāng)web應(yīng)用復(fù)雜到一定程度時(shí),出現(xiàn)了前端框架,開發(fā)者不用直接操作DOM。

未來,當(dāng)「優(yōu)先級(jí)調(diào)度」復(fù)雜到一定程度時(shí),一定也會(huì)出現(xiàn)集成解決方案,讓開發(fā)者不用直接操作優(yōu)先級(jí)。

慢著,這不就是React現(xiàn)在在做的事么?

參考資料

[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


網(wǎng)頁標(biāo)題:PostTask:React的殺手锏被瀏覽器原生實(shí)現(xiàn)了?
文章地址:http://m.5511xx.com/article/cddjeis.html