虛擬DOM

真實DOM解析流程

瀏覽器渲染的過程主要包括以下五步:

瀏覽器獲取到 HTML 文檔并解析 DOM 樹
  • 解析 CSS 構(gòu)建層疊樣式表模型CSSOM(CSS Object Model)
  • 將 DOM Tree 和 CSSOM 合并成一個 Render Tree
  • 有了Render Tree,瀏覽器便能獲取到每個節(jié)點的 CSS 定義和從屬關(guān)系,從而可以計算出每個節(jié)點的現(xiàn)實位置
  • 通過上一步的計算規(guī)則進行繪制頁面
image.png
虛擬DOM產(chǎn)生的背景

用原生 js 或 jquery 去操作 DOM 時,瀏覽器會從構(gòu)建 DOM 樹到繪制全部執(zhí)行一遍。
當(dāng)我們頻繁操作 DOM 的時候,瀏覽器并不知道下一次操作 DOM 是什么時候,所以每次 DOM 有更新的時候,瀏覽器都會執(zhí)行一遍上面的流程,比如計算 DOM 坐標(biāo)值時可能就會大量的浪費性能,在計算完這次的坐標(biāo)的時候,緊接著 DOM 的位置又發(fā)生變化,又要重新計算,前一次計算所消耗的性能就白白浪費了,操作太頻繁的話還會造成頁面卡頓。虛擬 DOM 的出現(xiàn)就是為了解決這個問題。

虛擬DOM原理

虛擬DOM就是利用js運行速度快的這一優(yōu)點對操作DOM進行優(yōu)化的,用js模擬DOM樹,在js中處理DOM的操作再渲染,簡單概括分為以下三點:

  • 用javascript對象模擬DOM樹并且渲染DOM樹;
  • 通過 diff算法 比較新舊DOM樹,得到差異的對象;
  • 將差異的對象應(yīng)用到渲染的DOM樹中。

真實DOM:

<div id="app">
    哈哈
    <p>123</p>
</div>

虛擬DOM:

var vNode = {
    tag: 'div',
    props: {id: 'app'},
    children: [
        {
            tag: 'p',
            props: {},
            children: [],
            context: '123'
        }
    ],
    context: '哈哈'
}

虛擬DOM實現(xiàn):

function createComponent(tag) {
    let child = [];
    for(let i = 0; i < tag.children.length; i++) {
        if(tag.children[i].children.length <= 0) {
            child[i] = {
                tag: tag.children[i].nodeName.toLowerCase(), 
                props: tag.children[i].attributes, 
                context: tag.children[i].innerText,
                children: []
            };
        } else {
            child[i] = createComponent(tag.children[i]);
        }
    }
    let vNode = {
        tag: tag.nodeName.toLowerCase(), 
        props: tag.attributes, 
        children: child,
        context: tag.childNodes[0].nodeValue
    }
    return vNode;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 你有沒有留意到?優(yōu)秀的解決方案思想都是相通的:當(dāng)你研究 Flutter 渲染原理時會發(fā)現(xiàn) Flutter R...
    FeelsChaotic閱讀 2,151評論 2 7
  • 真是DOM 的缺陷: js 操縱Dom 會 影響到整個渲染流水線 我們可以調(diào)用document.body.appe...
    Lyan_2ab3閱讀 833評論 0 1
  • 一、真實DOM和其解析流程? 瀏覽器渲染引擎工作流程都差不多,大致分為5步,創(chuàng)建DOM樹——創(chuàng)建StyleRu...
    LoveBugs_King閱讀 190,976評論 23 336
  • 真實DOM解析流程 瀏覽器渲染的過程主要包括以下五步: 瀏覽器獲取到 HTML 文檔并解析 DOM 樹 解析 CS...
    古月丶閱讀 3,053評論 0 11
  • 前言 ??Vue2.0引入了虛擬DOM,比Vue1.0的初始渲染速度提升了2~4倍,并大大降低了內(nèi)存消耗。目前主流...
    A鄭家慶閱讀 13,932評論 0 10

友情鏈接更多精彩內(nèi)容