解讀vue3源碼-2

提示:看到我 請讓滾去學習

vue3編譯模版的提升

文章目錄

  • vue3編譯模版的提升
    • 靜態節點提升
    • 補丁標志和block的使用
    • 附錄:


template explorer可以將我們的源模版轉化成渲染函數代碼,vue2中就有,而Vue3 template explorer 功能更加豐富。

靜態節點提升

請添加圖片描述
當我們開啟靜態提升,可以發現靜態節點確實被從渲染函數中提升以便可以在每個渲染器上重用它,所以在每次組件更新時,我們都會重新調用render函數,但是_hoisted_1都將被重用。

請添加圖片描述
這樣有兩點好處:

1.避免重新創建對象,然后刪除

2.在模版算法中,當看到兩個節點在同一位置時,在嚴格平等的情況下,我們可以跳過它,因為我們知道它永遠不會改變

補丁標志和block的使用

請添加圖片描述

Vue 3 template explorer中當我們綁定一個監聽器,編譯器會生成一個補丁標志,表明這個節點有動態props需要修補下,以及需要修補的名稱是onclick。通常使用簡單的虛擬dom渲染算法,在div上綁定的元素,整個對象必須作為一個整體來diff,所以如果div上綁定了一個靜態的id屬性,我們還是會對比整個對象,確保它不會改變,因為運行時并不能確定它是否改變。但是vue3的編譯器通過補丁和關鍵字結合可以為運行時提供足夠信息,確定可以改變的是哪些屬性。所以渲染是可以跳過編譯器那些推斷的永遠不會改變的props。

上述在虛擬dom發生改變時,不會檢查整個節點的所有屬性方法,而是結合補丁標志檢查可改變的東西。但實際上,我們更多時候綁定一個事件監聽器,并不會更改事件處理程序,所以vue3默認開啟cacheHandlers

請添加圖片描述

開啟cacheHandlers會把我們的事件變成一個內聯函數,并在第一次渲染時將其緩存,在此后渲染中,我們將始終使用同一個內聯處理程序,但是里面的函數會訪問ctx.onClick,所以即時onClick發生變化,我們不需要對vnode本身做任何事,所以上述代碼在更新過程中現在可以完全跳過整個節點。

所有這些在vue2父子組件中,即使子組件什么都沒有改變,也會導致所有子組件在父組件重新渲染時,所有接受到那個props的子組件重新渲染,在大型應用中,會引起連鎖反應,因為你在向下傳遞函數,在每次渲染時,都會創建一個新的內聯函數,會導致所有收到那個props的子組件重新渲染,所以vue3中使用句柄緩存,可以避免在大型組件樹中發生不必要的渲染

當我們調用render函數會生成一個類似以下的vdom

請添加圖片描述

當vdom某些數據發生改變時,渲染器并不知道發生了什么改變,所以它會遞歸遍歷整棵樹,進行新舊快照對比,對比新舊節點找出改變了什么,這顯然會導致更多的性能問題。

請添加圖片描述

例如上述代碼我們每次更新發生變化的只有span標簽,編譯器會使用_openBlock(),將模版的根變成我們所稱的塊(block),上圖中的_openBlock(),當塊打開時,所有的節點表達式都會被評估是否是動態的,當節點創建時攜帶有補丁表示的東西(動態)都會被跟蹤,并且添加到當前打開的block作為動態子節點。所以在render方法整個調用后,根div將有一個額外的屬性,稱為動態子節點,它是只包含了攜帶補丁標識的子節點的扁平化數組。不管dom節點層級多深,塊都只跟蹤其上的動態節點。

請添加圖片描述

另外如果使用v-if等結構指令,它會改變節點結構,當v-if值切換時節點會從dom樹上消失,所以對于根節點的block,使用v-if的節點下的節點將不再安全。所以v-if節點會變成一個塊,這個塊會變成父節點的動態快被跟蹤,所以有嵌套的塊,將在扁平化數組中跟蹤他自己的動態子對象。

所以對于整個dom樹在跟新時不再需要再檢查每個vnode的變化,而是遞歸去找block,得到block內可能發生變化的信息。

在這里插入圖片描述

補丁信息本身還編碼了關于什么樣工作信息,例如TEXT表示在你試圖區分這個節點時,只需要檢查它的文本內容而不需要關注例如props等其他信息

附錄:

vue2在線模版編譯器:[https://vue3js.cn/vue-template-explorer/]{.underline}

vue3在線模版編譯器:[https://template-explorer.vuejs.org/#]{.underline}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/19775.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19775.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/19775.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

外匯天眼:ESMA發布針對在投資服務中使用人工智能的公司的指導意見

歐洲證券和市場管理局(ESMA),歐盟的金融市場監管機構和監督機構,發布了一份聲明,為在向零售客戶提供投資服務時使用人工智能技術(AI)的公司提供初步指導。 盡管人工智能的普及仍處于初期階段&am…

請描述Vue常用的修飾符

在 Vue 中,修飾符(Modifiers)常用于自定義指令(Directives)和事件監聽(Event Listeners)中,以改變指令或事件監聽器的默認行為。以下是一些 Vue 中常用的修飾符: 1. 事件…

你認識nginx嗎,nginx是做什么的,nginx可以做什么 --2)nginx配置

hello大家今天教大家如何用nginx實驗tomcat的負載均衡,同理其他的也可以,如httpd等 首先需要準備一個nginx和tomcat包,這里用到的是版本號為 然后需要準備最少三臺linux虛擬機,然后我們開始吧 1.安裝tomcat 解包 tar zxf /mnt/…

學習 SSH Key 生成方法

SSH Key 是用于身份驗證的一對密鑰,包括公鑰和私鑰。公鑰可以放在需要訪問的服務器上,私鑰則保留在本地。當你使用SSH連接到支持SSH Key認證的服務器時,服務器會用公鑰來加密一個隨機生成的字符串發送給客戶端,客戶端用私鑰解密并…

C語言(字符和字符串函數)2

Hi~!這里是奮斗的小羊,很榮幸各位能閱讀我的文章,誠請評論指點,歡迎歡迎~~ 💥個人主頁:小羊在奮斗 💥所屬專欄:C語言 本系列文章為個人學習筆記,在這里撰寫成文一…

【LeetCode 130. 被圍繞的區域】

1. 題目 2. 分析 這題其實非常不錯。如果正向解,非常麻煩;因為很難界定哪些O是被包圍的?但是如果反向解呢?因為邊界的O不會被包圍,那么就可以想到跟邊界O相連的O都不會被包圍。那么除此之外的O都會被包圍&#xff0c…

【sklearn | 6】無監督學習與聚類分析

在前幾篇教程中,我們探討了 sklearn 的基礎、高級功能,異常檢測與降維,時間序列分析與自然語言處理,模型部署與優化,以及集成學習與模型解釋。本篇教程將專注于無監督學習和聚類分析,這在探索性數據分析和數…

github有趣項目:自制“我的世界” project make

videocodehttps://www.youtube.com/watch?v4O0_-1NaWnY,https://www.bilibili.com/video/BV1oj411p7qM/?https://github.com/jdah/minecraft-weekend MAKE git clone --recurse-submodules https://github.com/jdah/minecraft-weekend.git 正克隆到 minecraft-weekend... …

x264 參考幀管理源碼分析

x264參考幀管理 在x264中,參考幀的管理是一個重要的組成部分,因為它涉及到視頻編碼過程中的幀間預測。以下是關于x264參考幀管理的一些關鍵點: 參考幀的分類:在x264中,幀可以分為幾類,包括參考幀、當前編碼幀和未使用幀等。 參考幀的作用:參考幀用于幀間預測,通過比較當…

【Qt】之【Get√】QByteArray寫入txt文件、QByteArray截取數據

寫入文件 QFile file(path);if (file.open(QIODevice::WriteOnly)) {// 將 QImage 保存到文件file.write(jsonData.toByteArray());// 關閉文件file.close();SCDebug << "saved to" << path;} else {SCDebug << "Failed to open file for wri…

直播分享|深入解析ts-morph:通過注釋生成類型文檔

? ? 你看小狗在叫 樹葉會笑 風聲在呢喃? ? 乘風追夢&#xff0c;童心未泯 OpenTiny 預祝所有大朋友、小朋友兒童節快樂~ 與此同時&#xff0c;OpenTiny 貢獻者直播也即將開啟啦~ 直播主題&#xff1a;【深入解析ts-morph&#xff1a;通過注釋生成類型文檔】 6月1日&am…

碳課堂|入門必看!碳足跡(CFP)主要國際標準一覽

一、碳足跡概念 碳足跡&#xff08;Carbon FootPrint&#xff0c;CFP&#xff09;是用來衡量個體、組織、產品或國家在一定時間內直接或間接導致的二氧化碳排放量的指標。產品碳足跡屬于碳排放核算的一種&#xff0c;一般指產品從原材料加工、運輸、生產到出廠銷售等流程所產生…

NeuralForecast 推理 - 從csv文件里讀取數據進行推理

NeuralForecast 推理 - 從csv文件里讀取數據進行推理 flyfish from ray import tunefrom neuralforecast.core import NeuralForecast from neuralforecast.auto import AutoMLP from neuralforecast.models import NBEATS, NHITS import torch import torch.nn as nn import…

【Java】剛剛!突然!緊急通知!垃圾回收!

【Java】剛剛&#xff01;突然&#xff01;緊急通知&#xff01;垃圾回收&#xff01; 文章目錄 【Java】剛剛&#xff01;突然&#xff01;緊急通知&#xff01;垃圾回收&#xff01;從C語言的內存管理引入&#xff1a;手動回收Java的垃圾回收機制引用計數器循環引用問題 可達…

SpringBoot六種API請求參數讀取方式

SpringBoot六種API請求參數讀取方式 同步請求和異步請求 同步: 指單線程依次做幾件事異步: 指多線程同時做幾件事 同步請求: 指客戶端瀏覽器只有一個主線程, 此線程負責頁面的渲染和發出請求等操作, 如果此主線程發出請求的話則停止渲染而且會清空頁面顯示的內容 直到服務器響…

優化基礎(二):線性組合、仿射組合、錐組合、凸組合、線性集合、仿射集合、錐集合、凸集合的理解

文章目錄 前言組合線性組合 (linear combination)仿射組合 (affine combination)錐組合 (conic combination)凸組合 (convex combination) 集合仿射集合凸集合 練習&#xff1a;哪個圖形是凸的&#xff0c;哪個是仿射的&#xff1f;參考資料 前言 組合側重于描述由一些基點生成…

越洗越黑”的Pandas數據清洗

引言 先來一個腦筋急轉彎活躍一下枯燥工作日常&#xff0c;問&#xff1a;“什么東西越洗越黑&#xff1f;” 有沒有猜到的&#xff1f;猜不到我告訴你吧&#xff01; 答案是“煤球”。那么這個腦機急轉彎跟我們要討論的話題有沒有關系呢&#xff1f; 嗯是的&#xff0c;還是沾…

三相智能電表通過Modbus轉Profinet網關與PLC通訊案例

Modbus轉Profinet網關&#xff08;XD-MDPN100/300&#xff09;的主要功能是實現Modbus協議和Profinet協議之間的轉換和通信。Modbus轉Profinet網關集成了Modbus和Profinet兩種協議&#xff0c;支持Modbus RTU主站/從站&#xff0c;并可以與RS485接口的設備&#xff0c;它自帶網…

「前端+鴻蒙」核心技術HTML5+CSS3

1、CS架構與BS架構 CS架構(Client-Server):客戶端/服務器架構。用戶通過客戶端軟件與服務器進行交互,客戶端需要安裝特定的軟件才能訪問服務器上的資源。BS架構(Browser-Server):瀏覽器/服務器架構。用戶通過瀏覽器訪問服務器上的網頁,無需安裝額外的軟件,所有的交互都…

接口請求參數為文件時如何測試

方法 工具&#xff1a;Postman 步驟&#xff1a;①點擊body②點擊form-data③選擇key類型為fie ④輸入參數名⑤選擇參數上傳⑥發送請求