如何在不看源碼情況下學(xué) petite-vue 源碼
大家好,我是卡頌。
周末沒啥事,準(zhǔn)備找個優(yōu)秀且代碼量不多的庫學(xué)習(xí)下。最終選擇了最近發(fā)布的petite-vue,原因如下:
代碼量少(只有5.8kb),且源碼模塊化程度高(相比于
React),易讀基于
Vite構(gòu)建,執(zhí)行yarn dev就能開始調(diào)試源碼沒有
虛擬DOM、編譯時(shí)方案,可以作為讀Vue源碼的鋪墊底層的響應(yīng)式更新原理同樣適用于
Mobx、SolidJS等庫,一次閱讀多份收獲

Vue了,如何才能高效學(xué)習(xí)源碼呢?petite-vue為例為大家示范學(xué)源碼的正確姿勢。怎么快怎么來
petite-vue理解為:用真實(shí)DOM取代Vue模版的簡易Vue。Demo:<script type="module">
import { createApp } from '../src'
createApp({count: 0}).mount()
</script>
<div v-scope>
<button @click="count++">add 1</button>
<p>{{count}}</p>
</div>
div及其子孫節(jié)點(diǎn)是真實(shí)的DOM標(biāo)簽,所以頁面初始化時(shí)如下:
petite-vue初始化:createApp({count: 0}).mount()


Performance面板看看首屏渲染的調(diào)用棧:

createContext與reactive關(guān)鍵詞判斷大概是創(chuàng)建響應(yīng)式上下文。至于響應(yīng)式的含義,我們還不清楚。
遍歷
DOM完成數(shù)據(jù)與視圖的雙向綁定
初始化渲染
驗(yàn)證遍歷DOM
walk與walkChildren被調(diào)用多次,大概率他們就是具體遍歷工作執(zhí)行的方法,讓我們確認(rèn)下。walk方法中打上log:export const walk = (node: Node, ctx: Context): ChildNode | null | void => {
console.log('walk', node);
// ...
}
"\n "對應(yīng)的文本節(jié)點(diǎn),打印順序如下:walk div
walk <button>add 1</button>
walk "add 1"
walk <p>0</p>
walk "0"
petite-vue mount時(shí)采用深度優(yōu)先遍歷,并對遍歷到的每個與上下文狀態(tài)相關(guān)的DOM節(jié)點(diǎn)進(jìn)行處理。Demo中,上下文包含狀態(tài){count: 0}:createApp({count: 0}).mount()
<p>{{count}}</p>變?yōu)?/span><p>0</p>。確定雙向綁定的粒度
DOM會被重新遍歷并執(zhí)行相應(yīng)DOM操作?Performance后,點(diǎn)擊<button>add 1</button>觸發(fā)更新:
walk、walkChildren(或類似遍歷過程),只調(diào)用了reactiveEffect一個方法就更新了DOM。mount時(shí)的深度優(yōu)先遍歷建立了狀態(tài)與更新DOM的方法之間一一對應(yīng)的關(guān)系。DOM。狀態(tài)后,只需要找到與他有關(guān)系的更新DOM的方法執(zhí)行就行。count狀態(tài)與如下函數(shù)建立聯(lián)系:function setCount(value) {
p.textContent = value;
}
count變化后調(diào)用setCount(count)就能更新p對應(yīng)DOM。petite-vue的工作原理,主要包括兩點(diǎn):mount時(shí)深度優(yōu)先遍歷DOM,對有狀態(tài)的DOM(比如<p>{{count}}</p>)建立狀態(tài)與更新DOM的方法之間一一對應(yīng)的關(guān)系update時(shí)找到該狀態(tài)對應(yīng)的更新DOM的方法并執(zhí)行
Vue Mastery的Vue 3 Reactivity課程,可以補(bǔ)齊響應(yīng)式更新這塊知識。
總結(jié)
從
mount時(shí)與update時(shí)的調(diào)用棧推導(dǎo)出整體工作流程從
整體工作流程中發(fā)現(xiàn)核心知識 —— 響應(yīng)式更新
整體工作流程與響應(yīng)式更新后,再閱讀自己感興趣的部分才不至于陷入龐大的代碼量中。

評論
圖片
表情
