摘要:這個大概是的鉤子吧在每一次插入操作的時候都將節點這類型方法可以看出來是在調用對應的方法因為開始的時候就導入進來了插入節點操作的時候都需要加入子節點有子元素也就是的時候遞歸調用循環子節點生成對應著一些操作之后都要觸發鉤子函數。
snabbdom
本文的snabbdom源碼分析采用的是0.54版本(即未用ts重寫前的最后一版)
前期了解snabbdom被用作vue的虛擬dom。本文的一個目的就是對于進入vue源碼預備。
本文大致講解,而不會完全細化至代碼行數講解
modules
helper
h.js
htmldomapi.js
is.js
snabbdom.js
thunk.js
vnode.js
vnode.js說白了就是返回一個數據表示dom結構的數據對象
h.js則是對多重有子結構 text節點之類的數據對象進行在再處理
返回一個解析好的vnode
一些dom操作的api封裝
結合到后面做vnode渲染到真實dom的操作
is.js 兩個工具函數 一個是是否為數組 一個是是否為基本類型 也就是數字string這些文本節點
里面放的則是一些對應的數據結構上例如property attribute之類的輔助操作
attributes
里面用來更新節點的屬性
基本的套路都是一個for in迭代 然后內部判斷patch 判斷是否需要更新亦或者是刪除 如果存在屬性的話 且不同肯定是更新 如果新有了 舊的沒有就增加 新沒有了舊還有 對于一些屬性直接設置false 或者是賦空即可
class.js
這里也是一些利用classList做快速增加修改刪除節點上的class的操作
基本簡單的判斷就是這種套路
datatset
設置節點屬性值
eventlistener
看源碼可以發現 事件綁定這一步傳入的參數實際上是被包裝的
利用函數封裝了一層handleevent
handleevent里面實際上是觸發invokeHandler
那么從源碼可以看出 實際上觸發dom節點的綁定事件實際上是在觸發
綁定在上下文為vnode的觸發器上。
props設置節點這個props是需要鍵值對的。一般自定義屬性值在這里聲明好一些,設置checked selected因為內部有一個booleanarray 其實有綁定的話只是做
property能夠從attribute中得到同步;
attribute不會同步property上的值;
模擬動畫幀 用requestAnimationFrame不兼容則用setTimeout
requestAnimationFrame的好處是它的刷新頻率會與瀏覽器一致
setTimeout則有時候可能出現丟失的情況
內部封裝一個兩層的調用來使用,大概是兩幀的意思
如果沒有delayed或者remove直接更新style即可
設置節點被destory時候的style
設置刪除效果也就是調用自定義的remove鉤子函數。如果沒有的話就調用全局的
這些定義都是根據api閱讀結合源碼發現的
remove鉤子執行后才會刪除樣式
這塊是在網上看的源碼解讀
因為diff算法應該是一個vitrual dom實現的重點了
createKeyToOldIdx 給舊節點設置key用于比對
// create => style,class,dataset,eventlistener,props,hero
// update => style,class,dataset,eventlistener,props,hero
// remove => style
// destory => eventlistener,style,hero
// pre => hero
// post => hero
這是一些鉤子函數的使用api吧
init做一些模塊的初始化 還有全局鉤子的初始化
傳入一個節點 然后對這個節點進行操作提取 轉換成vnode數據對象
// remove攔截器 style里面提及的
// 對remove鉤子回調做減法然后才刪除節點
vnode映射真實節點
看到這里的時候對insertedVnodeQueue很不懂 究竟要干嘛
然后突然想明白了。這個大概是inserted的鉤子吧- -
在每一次插入操作的時候都將節點insert
api.這類型方法可以看出來是在調用對應modules的方法
因為開始的時候就導入進來了
插入節點操作的時候都需要加入insertedVnodeQueue
子節點有子元素 也就是children的時候遞歸調用循環子節點生成tree
對應著一些操作之后都要觸發鉤子函數。
以前并不清楚鉤子函數生命周期觸發原理,這次倒是見識了
invokeDestroyHook 手動觸發destroy鉤子 先觸發vnode的鉤子 在觸發全局鉤子 再遞歸觸發子節點的鉤子
removeVnodes remove操作 因為要使得remove鉤子觸發后才刪除節點
updateChildren patchVnode 最主要的diff算法
利用前后索引的方式
進行對兩樹的遍歷patch 復雜度是O(n)
因為比較都是在同層做比較對比patch
起點在patchVnode 然后patch過程updateChildren 然后調用updateChildrens
一個分段的偽遞歸
而當索引不生效 這個時候則采用傳統的key-index比對
網上的一些simple vitrual dom教程
實現的是基于深度遍歷做list diff
然后取得節點的變化
在做對應操作 。
snabbdom的patch等等 都是基于數據對象做的。
而一些vitrual的實現是基于樹的patch
virtual-dom的一個好處就是讓我們可以從繁雜無章的dom操作中解脫,利用js對象的形式映射到dom,從而操作js數據操作dom
所謂的性能其實還是得看你怎么用,大片的修改dom不見得virtual dom就有多好用。
打算也實現個simple dom 占坑~~(當然在path diff算法上可能不存在優化了)(占坑占坑)
snabbdom也是vue使用的virtual dom 庫,emmm之后可以看看vue是怎么結合使用snabbdom的。
撒花。thanks
如果有需要詳細代碼解析的朋友可以聯系我獲取。
snabbdom源碼地址
不錯的snabbdom源碼解讀
本人博客
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/95066.html
摘要:閱讀源碼的時候,想了解虛擬結構的實現,發現在的地方。然而慢慢的人們發現,在我們的代碼中布滿了一系列操作的代碼。源碼解析系列源碼解析一準備工作源碼解析二函數源碼解析三對象源碼解析四方法源碼解析五鉤子源碼解析六模塊源碼解析七事件處理個人博客地址 前言 虛擬 DOM 結構概念隨著 react 的誕生而火起來,之后 vue2.0 也加入了虛擬 DOM 的概念。 閱讀 vue 源碼的時候,想了解...
介紹 這里是 typescript 的語法,定義了一系列的重載方法。h 函數主要根據傳進來的參數,返回一個 vnode 對象 代碼 代碼位置 : ./src/h.ts /** * 根據選擇器 ,數據 ,創建 vnode */ export function h(sel: string): VNode; export function h(sel: string, data: VNodeData...
摘要:對象是一個對象,用來表示相應的結構代碼位置定義類型定義類型選擇器數據,主要包括屬性樣式數據綁定時間等子節點關聯的原生節點文本唯一值,為了優化性能定義的類型定義綁定的數據類型屬性能直接用訪問的屬性樣式類樣式數據綁定的事件鉤子創建對象根據傳入的 vnode 對象 vnode 是一個對象,用來表示相應的 dom 結構 代碼位置 :./src/vnode.ts 定義 vnode 類型 /** ...
摘要:元素從父節點刪除時觸發,和略有不同,只影響到被移除節點中最頂層的節點在方法的最后調用,也就是完成后觸發源碼解析系列源碼解析一準備工作源碼解析二函數源碼解析三對象源碼解析四方法源碼解析五鉤子源碼解析六模塊源碼解析七事件處理個人博客地址 文件路徑 : ./src/hooks.ts 這個文件主要是定義了 Virtual Dom 在實現過程中,在其執行過程中的一系列鉤子。方便外部做一些處理 /...
摘要:閑聊在學的過程中,虛擬應該是聽的最多的概念之一,得知其是借鑒進行開發,故習之。以我的觀點來看,多個相同元素渲染時,則需要為每個元素添加值。 閑聊:在學vue的過程中,虛擬dom應該是聽的最多的概念之一,得知其是借鑒snabbdom.js進行開發,故習之。由于我工作處于IE8的環境,對ES6,TS這些知識的練習也只是淺嘗輒止,而snabbdom.js從v.0.5.4這個版本后開始使用TS...
閱讀 3694·2021-11-11 10:58
閱讀 2476·2021-09-22 15:43
閱讀 2868·2019-08-30 15:44
閱讀 2187·2019-08-30 13:08
閱讀 1821·2019-08-29 17:28
閱讀 884·2019-08-29 10:54
閱讀 675·2019-08-26 11:46
閱讀 3507·2019-08-26 11:43