Vue 3-0 到底怎麼變快?

作者:快跑啊小盧_

juejin.cn/post/6979039113689169957

前言🖖

自從Vue3.0發佈後一直想要學習一下新特性,誰曾想到一直鴿到了現在。面對前端行業不學習就被淘汰的內卷環境什麼都要學起來呀,學的時候索性記錄總結一下。

Vue 3.0 亮點🤩

總的來說就是更快更小更舒服

Vue 3.0 到底是如何變快🤔

大家都說Vue 3.0變快了,那他到底是哪裏快了呢?做了哪些優化纔會讓它有這種效果?

diff 算法優化🦄

  <div>
    <p>hi 小盧!!</p>
    <p>{{sth}}</p>
  </div>

Vue 2.x

Vue 3.0

在 Vue 3 Template Explorer 中顯示如下 

上面flag的 1 是Patchflag枚舉, 取值爲 1 代表這個元素的文本是動態綁定的

附錄:PatchFlags
export const enum PatchFlags {TEXT = 1,1/動態文本節點
		CLASS = 1<<1,1/ 2// 動態 classSTYLE= 1<<2,// 4//動態 style
		PROPS = 1<< 3,// 8// 動態屬性,但不包含類名和樣式
		FULL_PROPS = 1<<4,// 16 //具有動態 key屬性,當key改變時,需要進行完整的 diff 比較。
		HYDRATE_EVENTS = 1<<5,// 32//帶有監聽事件的節點
		STABLE_FRAGMENT = 1<<6,// 64//一個不會改變子節點順序的 fragment
		KEYED_FRAGMENT = 1<<7,// 128//帶有key屬性的 fragment 或部分子字節有
		keyUNKEYED_FRAGMENT = 1<<8,// 256//子節點沒有key 的 fragment
		NEED_ PATCH =1<<9,//512//一個節點只會進行非 props比較
		DYNAMIC_SLOTS = 1 << 10,//1024 // 動態的插槽
		
		// SPECIAL FLAGS (下面是特殊的)--------------------------------------------------------- 
		// 以下是特殊的flag,不會在優化中被用到,是內置的特殊flag
		// 表示他是靜態節點,他的內容永遠不會改變,對於hydrate的過程中,不會需要再對其子節點進行diff
		HOISTED = -1,
		BAIL = -2, // 用來表示一個節點的diff應該結束
}

hoistStatic(靜態提升)🦓

舉個例子說明一下

<div>
  <div>Hello Vue3.0</div>
  <div>hi 小盧!</div>
  <p>{{sth}}</p>
</div>

未使用靜態提升

 使用靜態提升

cacheHandlers(事件偵聽器緩存)🐲

舉個例子說明一下

<div>
  <div>Hello Vue3.0</div>
  <div>hi 小盧!</div>
  <p>{{sth}}</p>
  <div @click="doSthing">我是一個點擊事件</div>
</div>

未使用事件偵聽器緩存

 使用事件偵聽器緩存

寫在最後👌

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/lsjrWQTgl23TDxcwpdfWDA