<kbd id="5sdj3"></kbd>
<th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>

    增量 DOM 與虛擬 DOM 的對比使用

    共 2835字,需瀏覽 6分鐘

     ·

    2021-01-09 17:26


    如果你熟悉 React,你大概聽說過虛擬 DOM 的概念。React 受歡迎的主要原因之一就是通過虛擬 DOM 提高用戶界面性能。

    然而,當 Angular 在 2019 年發(fā)布他們新的渲染器 Angular Ivy 時,很多人想知道為什么他們選擇了增量 DOM 而不用虛擬 DOM。盡管如此,Angular 還是堅持這個想法。所以你可能會想,為什么 Angular 一開始就使用增量 DOM,并且還在繼續(xù)使用。請跟隨本文一探究竟。

    首先,讓我們從虛擬 DOM 開始,了解它是如何工作的。

    虛擬 DOM 的工作方式

    虛擬 DOM 的主要概念是在內(nèi)存中保留 UI 的虛擬表示,并使用協(xié)調(diào)(reconciliation)過程將其與真實 DOM 同步。該過程包括三個主要步驟:

    • 當用戶 UI 發(fā)生變化時,將整個用戶 UI 渲染到虛擬 DOM 中。

    • 計算之前虛擬 DOM 和當前虛擬 DOM 表示形式之間的差異。

    • 根據(jù)變化差異更新真實 DOM。

    現(xiàn)在你已經(jīng)對虛擬 DOM 有了一個基本的了解,接下來讓我們來深入了解一下增量 DOM。

    增量 DOM 的工作方式

    增量 DOM 通過使用真實 DOM 來定位代碼更改,帶來了一種比虛擬 DOM 更簡單的方法。因此,內(nèi)存中不會有任何真實 DOM 的虛擬表示來計算差異,真實 DOM 僅用于與新 DOM 樹進行差異比較。

    增量 DOM 概念背后的主要思想是將每個組件編譯成一組指令。然后,這些指令用于創(chuàng)建 DOM 樹并對其進行更改。

    增量 DOM 如此特別的原因

    看完上面的解釋后,你一定已經(jīng)得出結(jié)論,認為增量 DOM 要簡單得多。這還不是全部。

    增量 DOM 的真正優(yōu)點是它優(yōu)化了內(nèi)存的使用。

    當涉及到手機這類低內(nèi)存容量的設(shè)備時,這種優(yōu)化變得非常有用。而且,優(yōu)化內(nèi)存使用不是一件容易的事情。此外,應(yīng)用程序的內(nèi)存使用完全取決于包的大小和內(nèi)存使用。

    讓我們看看增量 DOM 是如何幫助我們減少包的大小以及降低內(nèi)存使用的。

    1. 增量 DOM 擁有 Tree Shaking 特性

    Tree Shaking 不是什么新事物,它是指在編譯目標代碼時移除上下文中未引用代碼的過程。

    增量 DOM 充分利用了這一點,因為它使用了基于指令的方法。如前所述,增量 DOM 在編譯之前將每個組件編譯成一組指令,這有助于識別未使用的指令。因此,它們可以在編譯時進行刪除操作。

    虛擬 DOM 不能夠 Tree Shaking,因為它使用解釋器,并且沒有辦法在編譯時識別未使用的代碼。

    2. 減少內(nèi)存使用

    如果你明白虛擬 DOM 和增量 DOM 的主要區(qū)別,你就應(yīng)該已經(jīng)知道這背后的秘密了。

    與虛擬 DOM 不同,增量 DOM 在重新呈現(xiàn)應(yīng)用程序 UI 時不會生成真實 DOM 的副本。此外,如果應(yīng)用程序 UI 沒有變化,增量 DOM 就不會分配任何內(nèi)存。大多數(shù)情況下,我們都是在沒有任何重大修改的情況下重新呈現(xiàn)應(yīng)用程序 UI。因此,按照這種方法可以極大地節(jié)省設(shè)備的內(nèi)存使用。

    增量 DOM 似乎有一個減少虛擬 DOM 內(nèi)存占用的解決方案。但是你可能想知道為什么其他框架不使用它?

    這里存在一個權(quán)衡

    雖然增量 DOM 通過按照更有效的方法來計算差異,從而減少了內(nèi)存使用,但是該方法比虛擬 DOM 更耗時。

    因此,在選擇使用增量 DOM 和虛擬 DOM 時,會對運行速度和內(nèi)存使用之間進行權(quán)衡。

    最終思考

    在這兩種文檔對象模型(DOM)中,虛擬 DOM 長期以來一直處于領(lǐng)先地位??梢哉f“虛擬 DOM 之所以流行是因為 React 流行”,另一方面 React 主要得益于這個虛擬 DOM 的特性。

    因此,很明顯虛擬 DOM 提供的速度和性能提升有助于 React 與其它框架競爭。

    虛擬 DOM 的優(yōu)缺點

    讓我們看一下虛擬 DOM 的一些主要優(yōu)點:

    • 高效的 diff 算法。

    • 簡單且有助于提升性能。

    • 沒有 React 也能使用。

    • 輕量。

    • 允許構(gòu)建應(yīng)用程序且不考慮狀態(tài)轉(zhuǎn)換。

    雖然虛擬 DOM 快速高效,但有一個缺點:

    這個區(qū)分過程(diffing process)確實減少了真實 DOM 的工作量。但它需要將當前的虛擬 DOM 狀態(tài)與之前的狀態(tài)進行比較,以識別變化。為了更好地理解這一點,讓我們舉一個小的 React 代碼示例:

    1. function WelcomeMessage(props) {

    2. return(

        1. "welcome">

          1. Welcome{props.name}

  • );

  • }

  • 假設(shè) props.name 的初始值是 Chameera ,后來改成了 Reader。整個代碼中唯一的變化就是 props,不需要改變 DOM 節(jié)點或者比較

    標簽內(nèi)部的屬性。然而,使用 diff 算法,有必要檢查所有步驟來識別變化。

    我們在開發(fā)過程中可以看到大量這樣的微小變化,比較用戶 UI 中的每個元素無疑是一種開銷。這可以被認為是虛擬 DOM 的主要缺點之一。

    然而,增量 DOM 為這個大量內(nèi)存使用問題提供了一個解決方案。

    增量 DOM 的優(yōu)缺點

    正如我前面提到的,增量 DOM 通過使用真實 DOM 跟蹤變化,提供了一個減少虛擬 DOM 內(nèi)存消耗的解決方案。這種方法大大降低了計算開銷,也優(yōu)化了應(yīng)用程序的內(nèi)存使用。

    所以,這是使用增量 DOM 相對于虛擬 DOM 的主要優(yōu)勢,我們可以列出增量 DOM 的其他優(yōu)點:

    • 易于與許多其他框架結(jié)合使用。

    • 簡單的 API 使其成為強大的目標模板引擎。

    • 適合基于移動設(shè)備的應(yīng)用程序。

    在大多數(shù)情況下,增量 DOM 不如虛擬 DOM 運行快。

    雖然增量 DOM 帶來了減少內(nèi)存使用的解決方案,但是該解決方案影響了增量 DOM 的速度,因為增量 DOM 的差異計算比虛擬 DOM 方法耗費更多時間。因此,我們可以認為這是使用增量 DOM 的主要缺點。

    這兩種 DOM 各有特色,我們不能只說虛擬 DOM 更好,或者增量 DOM 更好。然而,我可以肯定地說,虛擬 DOM 和增量 DOM 都是很好的選項,它們可以毫無問題地處理動態(tài) DOM 更新。

    以上就是本文全部內(nèi)容,感謝大家閱讀!

    關(guān)于本文 譯者:@前端zenblo 譯文:https://github.com/xitu/gold-miner/blob/master/article/2020/incremental-vs-virtual-dom.md 作者:@Chameera Dulanga 原文:https://blog.bitsrc.io/incremental-vs-virtual-dom-eb7157e43dca



    推薦閱讀




    我的公眾號能帶來什么價值?(文末有送書規(guī)則,一定要看)

    每個前端工程師都應(yīng)該了解的圖片知識(長文建議收藏)

    為什么現(xiàn)在面試總是面試造火箭?

    瀏覽 46
    點贊
    評論
    收藏
    分享

    手機掃一掃分享

    分享
    舉報
    評論
    圖片
    表情
    推薦
    點贊
    評論
    收藏
    分享

    手機掃一掃分享

    分享
    舉報

    <kbd id="5sdj3"></kbd>
    <th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>
    欧美三级精品 | 色多多视频在线观看 | 人妻av一区 | 免费黄色成人在线观看 | 操逼福利导航 |