点上面关注免费学习前端知识!


我们赞赏React在处理页面更新,数据绑定等方面的表现。但是为了实现这种性能,幕后发生了很多事情。其中一个影响因素是虚拟DOM。

现在,有了这个DOM的概念,现在你告诉我有这个全新的东西叫虚拟DOM。到底是怎么回事?。在我们进一步研究之前,让我们先了解一下实际的DOM。

什么是DOM?

在前端Web开发文档对象模型或DOM中,它是众所周知的,它是一个html文档的树形表示,其中树的每个节点都是html元素,而且html元素的父子关系也保存在树中。这个DOM结构为我们提供了一种遍历DOM节点并进行更改的方法。Javascript提供了一个API来操纵DOM,这被jQuery进一步抽象和简化了。

Javascript提供了一个API,并且jQuery提供了一个简化的API,如果这些API在React和其他前端框架需要的话。为了回答这个问题以及产生虚拟DOM的因素,我们必须了解DOM缺点。

DOM的缺点

是的,DOM对于简单的静态网站和UI更新很少的网站来说非常棒。但随后当人们开始采用更多的页面交互,事件驱动的方法来创建网站时,他们开始看到DOM的缺陷。

1. DOM突变的代价

与其他Javascript操作相比,更新DOM是一个非常慢的操作。无论何时您想要更新或添加DOM,都必须找到要更新的DOM节点或找到新节点必须插入的位置。在DOM节点数量较少的小型网站中,这不是问题。但是,如果大型网站具有大量DOM节点并且更新成本会成为性能问题。另外,当DOM更新浏览器重新绘制DOM节点时,会使其耗费更多时间。

2.无效更新

在计算确切需要更新的时候,DOM非常低效。有时它可能会更新超过必要的内容。例如,我们来考虑一个场景。您有一个从一组值生成<ul><li>项目列表。现在,当数组中的一个值发生变化时,整个列表将被重新渲染,这是不必要的,因为只有一个项目被更新。

通常,只要发生单个DOM突变调用,就会发生这些步骤:

  1. 遍历DOM直到必须插入或更新节点的位置。

  2. 更新DOM节点或添加它。

  3. 重新计算位置和CSS。

  4. 再遍历并重新绘制页面上的节点。

这两点加上单页应用程序(SPA)的兴起,这些应用程序通常具有大量的DOM节点,DOM突变和倾听网站变化,因此人们想出了框架来绕过这些性能问题。

虚拟DOM

首先,让我说这个React没有发明虚拟DOM,他们只是在性能方面做得更好。它的核心意义上的虚拟DOM只是一个Javascript对象,其中包含必须在真实DOM中呈现的节点列表,并且更新此Javascript对象中的值比更新实际DOM树要快得多。

基本上,如果DOM是实际的建筑,那么虚拟DOM就是建筑的蓝图。核心思想是修改蓝图总是比实际建筑容易和快速。

实现虚拟DOM的两种方式是:

  1. 脏检查:涉及定期检查组件是否有变化。

  2. Observable:其中涉及通过侦听器侦听更改以找出需要更新的组件。

据猜测,React使用后一种实现方式,这是反应单向数据绑定的主要原因之一,它的性能惊人。

哇,这一切都很好。但是它如何在React中实现?

同步虚拟和真实的DOM

基于组件更新更新DOM节点的过程通常由ReactDOM库完成。以下情况通常发生在这个过程中:

  1. 版本比较

  2. 批量更新真实的DOM

版本比较

当发生更新setState()时,会从头开始创建新的虚拟DOM树(不要担心它很快,因为它只是一个Javascript对象)。差异化算法比较旧的和新的虚拟DOM树以找到脏的组件。一旦找到所有脏的组件。然后确定更新真实DOM的最小步数。这种差异化算法在某些假设下工作,以便使它们快速,因为React使用启发式方法来处理事情,这里我不会讨论,但如果您想知道可以访问React 的Reconciliation文档。

批量更新Real DOM

一旦识别出更新的步骤,ReactDOM将所有这些步都骤放入事件循环中。ReactDOM这些步骤,它只调用DOM的重绘作为最后一步。因此,一旦所有步骤都执行完毕,事件循环就会在整个过程中调用DOM重新绘制,只有在DOM重新绘制后才能实现更快的性能。当ReactDOM更新真正的DOM时,组件发生更新时,它将等待真正的DOM更新完成。

这就是React的虚拟DOM如何带来惊人的性能,这已经成为React的商标。因此,在创建React应用程序时,请将虚拟DOM的这些概念放在头脑中,以便利用React提供的性能提升,充分发挥其潜力。

虚拟DOM - React的骨干相关推荐

  1. 【React深入】深入分析虚拟DOM的渲染原理和特性

    导读 React的虚拟DOM和Diff算法是React的非常重要的核心特性,这部分源码也非常复杂,理解这部分知识的原理对更深入的掌握React是非常必要的. 本来想将虚拟DOM和Diff算法放到一篇文 ...

  2. React框架简介(JSX语法、组件、虚拟DOM渲染)

    目录 React框架 为什么要学习React React特点 React核心 JSX语法 语法详解 React开发过程 实际DOM 虚拟DOM React组件 函数组件 类组件 虚拟DOM渲染过程 R ...

  3. React 中的虚拟 DOM 是什么?

    虚拟 DOM 是一个基本的 React 概念.如果您在过去几年编写过 React 代码,您可能听说过它.但是,你可能不明白它是如何工作的以及 React 为何使用它. 本文将介绍什么是虚拟 DOM,它 ...

  4. 手把手教你React(一)JSX与虚拟DOM

    初衷 学习React有一段时间了, 一直想找个时间写一个React的系列文章.忙里抽闲,完成了第一篇.写这系列文章的初衷是总结这段时间的技术学习,以及给那些想学习React的同学们一点帮助.我会尽量以 ...

  5. JavaScript是如何工作的:编写自己的Web开发框架 + React及其虚拟DOM原理

    摘要: 深入JS系列19. 原文:JavaScript是如何工作的:编写自己的Web开发框架 + React及其虚拟DOM原理 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 这是专门 ...

  6. 浅谈React虚拟DOM

    为什么要使用虚拟DOM 因为浏览器的DOM渲染是非常消耗性能的,很低效,我们使用虚拟DOM是为了提高DOM的渲染性能: 什么是虚拟DOM 虚拟DOM就是把真实的DOM树通过createElement转 ...

  7. 深入理解React(一)JSX与虚拟DOM

    初衷 使用 React 有一段时间了, 一直想找个时间写一个 React 的系列文章.忙里抽闲,完成了第一篇.写这系列文章的初衷是总结这段时间的技术学习,以及给那些想学习 React 的同学们一点帮助 ...

  8. 初识React Native虚拟DOM节点及API

    2019独角兽企业重金招聘Python工程师标准>>> Reative Native是著名设社交网络公司Facebook旗下的一款旨在实现虚拟Virtual交互到Native交互层高 ...

  9. [react] 为何说虚拟DOM会提高性能?

    [react] 为何说虚拟DOM会提高性能? 虚拟dom相当于在js和真实dom中间加了一个缓存,利用dom diff算法避免了没有必要的dom操作,从而提高性能 个人简介 我是歌谣,欢迎和大家一起交 ...

最新文章

  1. 对delegate进行扩展 打造通用的计时完成方法
  2. Jquery各版本下载
  3. vue脚手架项目技术集合
  4. PVLAN技术应用,网络管理员的新宠
  5. 高级软件工程2017第7次作业--C++团队项目:Beta阶段综合报告
  6. 深入理解操作系统原理之文件系统
  7. 手把手教你学DSP:基于TMS320C55x
  8. ZZULIOJ:1000: 从今天开始入坑C语言
  9. 如何对多个文件夹进行重命名?这个方法可以批量修改文件夹名、给文件夹名加统一前缀或后缀
  10. GAMES101-现代计算机图形学入门-闫令琪 - lecture6 光栅化2(抗锯齿) - 课后笔记
  11. #1829 : Tomb Raider(哈希)
  12. Android PopupWindow 的方法 弹出窗口方法
  13. 中兴推“小兴看看”,诠释智能家电的真谛
  14. 网络设备的连接以及配置
  15. 【好奇心驱动力】ESP32-CAM人体感应拍照并推送到微信
  16. element plus 表格合计
  17. 【JAVA】-- 期末考试复习题含答案(每章对应题、选择、填空、简答、编程)(下)
  18. 在线观看视频解决音频不同步
  19. 计算机四级信息安全工程师报名,2017计算机四级信息安全工程师考试练习题
  20. python性能分析(一)——使用timeit给你的程序打个表吧

热门文章

  1. 进阶必看的 RocketMQ ,就这篇了!
  2. 监控系统选型,这篇不可不读
  3. 如何用 GitHub Actions 写出高质量的 Python代码?
  4. 国内 UOS 统一操作系统曝光;联想宣布要 All in 5G​;Android Studio 新版发布 | 极客头条...
  5. 网易云音乐工程师,亲自揭晓消息队列改造之路! | 技术头条
  6. 一场全能的开发者大会,来自助力开发者成功进阶的华为云
  7. 如何快速提升 Go 程序性能?
  8. 大话云上“分布式实践”,理解 B、A、C 并不难!
  9. 拥抱开源未来 百度Doris进入顶级开源社区Apache
  10. 全民讨伐 Google AI “作恶”项目