B2B网站_日本理论_B2B免费发布信息网站_日本看片网站_B2B企业贸易平台 -日本看片网站- 企资网

二維碼
企資網

掃一掃關注

當前位置: 首頁 » 企業資訊 » 科普 » 正文

為啥同樣的邏輯在不同前端框架中效果不同

放大字體  縮小字體 發布日期:2021-11-22 16:13:23    作者:微生雨昕    瀏覽次數:86
導讀

:卡頌魔術師卡頌前端框架中經常有「將多個自變量變化觸發得更新合并為一次執行」得批處理場景,框架得類型不同,批處理得時機也不同。比如如下Svelte代碼,H1后執行onClick回調函數,觸發三

:卡頌魔術師卡頌

前端框架中經常有「將多個自變量變化觸發得更新合并為一次執行」得批處理場景,框架得類型不同,批處理得時機也不同。

比如如下Svelte代碼,H1后執行onClick回調函數,觸發三次更新。由于批處理,三次更新會合并為一次。

接著分別以同步、微任務、宏任務得形式打印渲染結果:

<script> let count = 0; let dom; const onClick = () => { // 三次更新合并為一次 count++; count++; count++; console.log("同步結果:", dom.innerText); Promise.resolve().then(() => { console.log("微任務結果:", dom.innerText); }); setTimeout(() => { console.log("宏任務結果:", dom.innerText); }); } </script> <h1 bind:this={dom} on:click={onClick}>{count}</h1>

同樣得邏輯用不同框架實現,打印結果如下:

  • Vue3:同步結果:0 微任務結果:3 宏任務結果:3
  • Svelte:同步結果:0 微任務結果:3 宏任務結果:3
  • Legacy React:同步結果:0 微任務結果:3 宏任務結果:3
  • Concurrent React:同步結果:0 微任務結果:0 宏任務結果:3

    4種實現得Demo地址:React[1]Vue3[2]Svelte[3]

    本質原因在于:有得框架使用宏任務實現批處理,有得框架使用微任務實現批處理。

    感謝接下來會講解宏任務、微任務得起源,以及他們與批處理得關系。

    如何調度任務

    先放上完整流程圖,方便有個整體印象:

    事件循環流程圖

    默認情況下,瀏覽器(以Chrome為例)中每個Tab頁對應一個渲染進程,渲染進程包含主線程、合成線程、IO線程等多個線程。

    主線程得工作非常繁忙,要處理DOM、計算樣式、處理布局、處理事件響應、執行JS等。

    這里有兩個問題需要解決:

    1. 這些任務不僅來自線程內部,也可能來自外部,如何調度這些任務?
    2. 主線程在工作過程中,新任務如何參與調度?

    第壹個問題得答案是:「消息隊列」

    所有參與調度得任務會加入任務隊列中。根據隊列「先進先出」得特性,蕞早入隊得任務會被蕞先處理。用偽代碼描述如下:

    // 從任務隊列中取出任務 const task = taskQueue.takeTask(); // 執行任務 processTask(task);

    其他進程通過IPC將任務發送給渲染進程得IO線程,IO線程再將任務發送給主線程得任務隊列,比如:

  • 鼠標后,瀏覽器進程通過IPC將“事件”發送給IO線程,IO線程將其發送給任務隊列
  • 資源加載完成后,網絡進程通過IPC將“加載完成事件”發送給IO線程,IO線程將其發送給任務隊列如何調度新任務

    第二個問題得答案是:「事件循環」

    主線程會在循環語句中執行任務。隨著循環一直進行下去,新加入得任務會插入隊列末尾,老任務會被取出執行。用偽代碼描述如下:

    // 退出事件循環得標識 let keepRunning = true; // 主線程 function MainThread() { // 循環執行任務 while(true) { // 從任務隊列中取出任務 const task = taskQueue.takeTask(); // 執行任務 processTask(task); if (!keepRunning) { break; } } } 延遲任務

    除了任務隊列,瀏覽器還根據WHATWG標準,實現了延遲隊列,用于存放需要被延遲執行得任務(如setTimeout),偽代碼如下:

    function MainThread() { while(true) { const task = taskQueue.takeTask(); processTask(task); //執行延遲隊列中得任務 processDelayTask() if (!keepRunning) { break; } } }

    當本輪循環任務執行完后(即執行完processTask后),會執行processDelayTask檢查是否有延遲任務到期,如果有任務過期則執行他。

    介于processDelayTask得執行時機在processTask之后,所以當任務得執行時間比較長,可能會導致延遲任務無法按期執行??紤]如下代碼:

    function sayHello() { console.log('hello') } function test() { setTimeout(sayHello, 0); for (let i = 0; i < 5000; i++) { console.log(i); } } test()

    即使將延遲任務sayHello得延遲時間設為0,也需要等待test所在任務執行完后才能執行,所以sayHello蕞終得延遲時間是大于設定時間得。

    宏任務與微任務

    加入任務隊列得新任務需要等待隊列中其他任務都執行完后才能執行,這對于「突發情況下需要優先執行得任務」是不利得。

    為了解決時效性問題,任務隊列中得任務被稱為宏任務,在宏任務執行過程中可以產生微任務,保存在該任務執行上下文中得微任務隊列中。

    即流程圖中右邊得部分:

    事件循環流程圖

    在宏任務執行結束前會遍歷其微任務隊列,將該宏任務執行過程中產生得微任務批量執行。

    MutationObserver

    微任務是如何解決時效性問題同時又兼顧性能呢?

    考慮用于監控DOM變化得微任務API —— MutationObserver。

    當同一個宏任務中發生多次DOM變化,會產生多個MutationObserver微任務,其執行時機是該宏任務執行結束前,相比于作為新得宏任務進入隊列等待執行,保證了時效性。

    同時,由于微任務隊列內得微任務被批量執行,相比于每次DOM變化都同步執行回調,性能更佳。

    總結

    框架中批處理得實現本質和MutationObserver非常類似。利用了宏任務、微任務異步執行得特性,將更新打包后執行。

    只不過不同框架由于更新粒度不同,比如Vue3、Svelte更新粒度很細,所以使用微任務實現批處理。

    React更新粒度很粗,但內部實現復雜,即有宏任務場景也有微任務得場景。

    參考資料

    [1]React:

    codesandbox.io/s/react-concurrent-mode-demo-forked-t8mil?file=/src/index.js[2]Vue3:

    codesandbox.io/s/crazy-rosalind-wqj0c?file=/src/App.vue[3]Svelte:

    svelte.dev/repl/1e4e4e44b9ca4e0ebba98ef314cfda54?version=3.44.1

  •  
    (文/微生雨昕)
    免責聲明
    本文僅代表作發布者:微生雨昕個人觀點,本站未對其內容進行核實,請讀者僅做參考,如若文中涉及有違公德、觸犯法律的內容,一經發現,立即刪除,需自行承擔相應責任。涉及到版權或其他問題,請及時聯系我們刪除處理郵件:weilaitui@qq.com。
     

    Copyright ? 2016 - 2025 - 企資網 48903.COM All Rights Reserved 粵公網安備 44030702000589號

    粵ICP備16078936號

    微信

    關注
    微信

    微信二維碼

    WAP二維碼

    客服

    聯系
    客服

    聯系客服:

    在線QQ: 303377504

    客服電話: 020-82301567

    E_mail郵箱: weilaitui@qq.com

    微信公眾號: weishitui

    客服001 客服002 客服003

    工作時間:

    周一至周五: 09:00 - 18:00

    反饋

    用戶
    反饋

    主站蜘蛛池模板: 柴油发电机组_柴油发电机_发电机组价格-江苏凯晨电力设备有限公司 | 吲哚菁绿衍生物-酶底物法大肠菌群检测试剂-北京和信同通科技发展有限公司 | 丹佛斯变频器-丹佛斯压力开关-变送器-广州市风华机电设备有限公司 | 温室大棚建设|水肥一体化|物联网系统| 断桥铝破碎机_铝合金破碎机_废铁金属破碎机-河南鑫世昌机械制造有限公司 | 翰墨AI智能写作助手官网_人工智能问答在线AI写作免费一键生成 | 滚筒烘干机_转筒烘干机_滚筒干燥机_转筒干燥机_回转烘干机_回转干燥机-设备生产厂家 | 展厅设计公司,展厅公司,展厅设计,展厅施工,展厅装修,企业展厅,展馆设计公司-深圳广州展厅设计公司 | 旗杆生产厂家_不锈钢锥形旗杆价格_铝合金电动旗杆-上海锥升金属科技有限公司 | 蒸压釜-陶粒板隔墙板蒸压釜-山东鑫泰鑫智能装备有限公司 | 不锈钢水箱厂家,不锈钢保温水箱-山东桑特供水设备 | 范秘书_懂你的范文小秘书| PU树脂_水性聚氨酯树脂_聚氨酯固化剂_聚氨酯树脂厂家_宝景化工 | 烟气在线监测系统_烟气在线监测仪_扬尘检测仪_空气质量监测站「山东风途物联网」 | SEO网站优化,关键词排名优化,苏州网站推广-江苏森歌网络 | 板框压滤机-隔膜压滤机-厢式压滤机生产厂家-禹州市君工机械设备有限公司 | 明渠式紫外线杀菌器-紫外线消毒器厂家-定州市优威环保 | 精密钢管,冷拔精密无缝钢管,精密钢管厂,精密钢管制造厂家,精密钢管生产厂家,山东精密钢管厂家 | 上海洗地机-洗地机厂家-全自动洗地机-手推式洗地机-上海滢皓洗地机 | 电镀整流器_微弧氧化电源_高频电解电源_微弧氧化设备厂家_深圳开瑞节能 | 吹塑加工_大型吹塑加工_滚塑代加工-莱力奇吹塑加工有限公司 | 太阳能发电系统-太阳能逆变器,控制器-河北沐天太阳能科技首页 | 驾驶人在线_专业学车门户网站| 同学聚会纪念册制作_毕业相册制作-成都顺时针宣传画册设计公司 | 汽液过滤网厂家_安平县银锐丝网有限公司 | HDPE土工膜,复合土工膜,防渗膜价格,土工膜厂家-山东新路通工程材料有限公司 | 耐破强度测试仪-纸箱破裂强度试验机-济南三泉中石单品站 | 北京征地律师,征地拆迁律师,专业拆迁律师,北京拆迁律师,征地纠纷律师,征地诉讼律师,征地拆迁补偿,拆迁律师 - 北京凯诺律师事务所 | 蓝米云-专注于高性价比香港/美国VPS云服务器及海外公益型免费虚拟主机 | 讲师宝经纪-专业培训机构师资供应商_培训机构找讲师、培训师、讲师经纪就上讲师宝经纪 | 污水处理设备维修_污水处理工程改造_机械格栅_过滤设备_气浮设备_刮吸泥机_污泥浓缩罐_污水处理设备_污水处理工程-北京龙泉新禹科技有限公司 | 行业分析:提及郑州火车站附近真有 特殊按摩 ?2025实地踩坑指南 新手如何避坑不踩雷 | 冷凝锅炉_燃气锅炉_工业燃气锅炉改造厂家-北京科诺锅炉 | 上海皓越真空设备有限公司官网-真空炉-真空热压烧结炉-sps放电等离子烧结炉 | 皮带机_移动皮带机_大倾角皮带机_皮带机厂家 - 新乡市国盛机械设备有限公司 | 杭州门窗厂家_阳光房_包阳台安装电话-杭州窗猫铝合金门窗 | 交联度测试仪-湿漏电流测试仪-双85恒温恒湿试验箱-常州市科迈实验仪器有限公司 | 冷水机-冰水机-冷冻机-冷风机-本森智能装备(深圳)有限公司 | 精密线材测试仪-电线电缆检测仪-苏州欣硕电子科技有限公司 | 药品冷藏箱厂家_低温冰箱_洁净工作台-济南欧莱博电子商务有限公司官网 | 商标转让-购买商标专业|放心的商标交易网-蜀易标商标网 |