记录--虚拟 DOM 和实际 DOM 有何不同?

这篇具有很好参考价值的文章主要介绍了记录--虚拟 DOM 和实际 DOM 有何不同?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

记录--虚拟 DOM 和实际 DOM 有何不同?

前言

本文我们会先聊聊 DOM 的一些缺陷,然后在此基础上介绍虚拟 DOM 是如何解决这些缺陷的,最后再站在双缓存和 MVC 的视角来聊聊虚拟 DOM。理解了这些会让你对目前的前端框架有一个更加底层的认识,这也有助于你更好地理解这些前端框架。

DOM 的缺陷

比如,我们可以调用 document.body.appendChild(node)body 节点上添加一个元素,调用该 API 之后会引发一系列的连锁反应。首先渲染引擎会将 node 节点添加到 body 节点之上,然后触发样式计算、布局、绘制、栅格化、合成等任务,我们把这一过程称为 重排。除了重排之外,还有可能引起重绘或者合成操作,形象地理解就是“牵一发而动全身”。另外,对于 DOM 的不当操作还有可能引发强制同步布局和布局抖动的问题,这些操作都会大大降低渲染效率。因此,对于 DOM 的操作时我们需要非常谨慎。

对于一些复杂的页面或者目前使用非常多的单页应用来说,其 DOM 结构是非常复杂的,而且还需要不断地去修改 DOM 树,每次操作 DOM 渲染引擎都需要进行重排、重绘或者合成等操作,因为 DOM 结构复杂,所生成的页面结构也会很复杂,对于这些复杂的页面,执行一次重排或者重绘操作都是非常耗时的,这就给我们带来了真正的性能问题。所以我们需要有一种方式来减少 JavaScript 对 DOM 的操作,这时候虚拟 DOM 就上场了。

什么是虚拟 DOM?

在谈论什么是虚拟 DOM 之前,我们先来看看虚拟 DOM 到底要解决哪些事情。

  1. 将页面改变的内容应用到虚拟 DOM 上,而不是直接应用到 DOM 上。
  2. 变化被应用到虚拟 DOM 上时,虚拟 DOM 并不急着去渲染页面,而仅仅是调整虚拟 DOM 的内部状态,这样操作虚拟 DOM 的代价就变得非常轻了。
  3. 在虚拟 DOM 收集到足够的改变时,再把这些变化一次性应用到真实的 DOM 上。

基于以上三点,我们再来看看什么是虚拟 DOM。为了直观理解,你可以参考下图:

记录--虚拟 DOM 和实际 DOM 有何不同?

该图是结合 React 流程画的一张虚拟 DOM 执行流程图,下面我们就结合这张图来分析下虚拟 DOM 到底怎么运行的。

  • 创建阶段。首先依据 JSX 和基础数据创建出来虚拟 DOM,它反映了真实的 DOM 树的结构。然后由虚拟 DOM 树创建出真实 DOM 树,真实的 DOM 树生成完后,再触发渲染流水线往屏幕输出页面。
  • 更新阶段。如果数据发生了改变,那么就需要根据新的数据创建一个新的虚拟 DOM 树;然后 React 比较两个树,找出变化的地方,并把变化的地方一次性更新到真实的 DOM 树上;最后渲染引擎更新渲染流水线,并生成新的页面。

既然聊到虚拟 DOM 的更新,那我们就不得不聊聊最新的 React Fiber 更新机制了。最开始的时候,比较两个虚拟 DOM 的过程是在一个递归函数里执行的,其核心算法是 reconciliation。通常情况下,这个比较过程执行得很快,不过当虚拟 DOM 比较复杂的时候,执行比较函数就有可能占据主线程比较久的时间,这样就会导致其他任务的等待,造成页面卡顿。

为了解决这个问题,React 团队重写了 reconciliation 算法,新的算法称为 Fiber reconciler,所谓的 Fiber reconciler,就是在执行算法的过程中出让主线程,这样就解决了之前执行函数占用时间过久的问题。至于具体的实现过程在这里就不详细分析了,如果感兴趣的话,你可以自行查阅相关资料进行学习。

了解完虚拟 DOM 的大致执行流程,你应该也就知道为何需要虚拟 DOM 了。不过以上都从单纯的技术视角来分析虚拟 DOM 的,那接下来我们再从双缓存和 MVC 模型这两个视角来聊聊虚拟 DOM。

双缓存

使用双缓存,可以让你先将计算的中间结果存放在另一个缓冲区中,等全部的计算结束,该缓冲区已经存储了完整的图形之后,再将该缓冲区的图形数据一次性复制到显示缓冲区,这样就使得整个图像的输出非常稳定。

在这里,你可以把虚拟 DOM 看成是 DOM 的一个 buffer,和图形显示一样,它会在完成一次完整的操作之后,再把结果应用到 DOM 上,这样就能减少一些不必要的更新,同时还能保证 DOM 的稳定输出。

MVC 模式

接下来我们再来看看虚拟 DOM 在 MVC 模式中所扮演的角色。

在各大设计模式当中,MVC 是一个非常重要且应用广泛的模式,因为它能将数据和视图进行分离,在涉及到一些复杂的项目时,能够大大减轻项目的耦合度,使得程序易于维护。关于 MVC 的基础结构,你可以先参考下图:

记录--虚拟 DOM 和实际 DOM 有何不同?

 

通过上图可以发现,MVC 的整体结构比较简单,由模型、视图和控制器组成,其核心思想就是将数据和视图分离,也就是说视图和模型之间是不允许直接通信的,它们之间的通信是通过控制器来完成的。

比如在分析 React 项目时,我们可以把 React 的部分看成是一个 MVC 中的视图,在项目中结合 Redux 就可以构建一个 MVC 的模型结构,如下图所示:

记录--虚拟 DOM 和实际 DOM 有何不同?

在该图中,我们可以把虚拟 DOM 看成是 MVC 的视图部分,其控制器和模型都是由 Redux 提供的。其具体实现过程如下:

  • 图中的控制器是用来监控 DOM 的变化,一旦 DOM 发生变化,控制器便会通知模型,让其更新数据。
  • 模型数据更新好之后,控制器会通知视图,告诉它模型的数据发生了变化。
  • 视图接收到更新消息之后,会根据模型所提供的数据来生成新的虚拟 DOM。
  • 新的虚拟 DOM 生成好之后,就需要与之前的虚拟 DOM 进行比较,找出变化的节点。
  • 比较出变化的节点之后,React 将变化的虚拟节点应用到 DOM 上,这样就会触发 DOM 节点的更新。
  • DOM 节点的变化又会触发后续一系列渲染流水线的变化,从而实现页面的更新。

在实际工程项目中,你需要学会分析出各个模块,并梳理出它们之间的通信关系,这样对于任何框架你都能轻松上手了。

本文转载于:

https://juejin.cn/post/7226971906652979255

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 记录--虚拟 DOM 和实际 DOM 有何不同?文章来源地址https://www.toymoban.com/news/detail-607552.html

到了这里,关于记录--虚拟 DOM 和实际 DOM 有何不同?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序篇之与vue有何不同

    大家好!又怀着兴奋的心情去学习了微信小程序,框架这个东西嘛,随着时代的新潮一波又一波的到来,一波又一波的被冲走。为什么要拿vue与小程序开发做对比呢? 这是因为我相信大家不会在没有学习到vue之前就把小程序给学习了,哈哈哈。这篇文章最好给已经接触过别的

    2024年02月09日
    浏览(42)
  • 文言一心与文心一言:究竟有何不同?

    大家好,小发猫降ai今天来聊聊文言一心与文心一言:究竟有何不同?,希望能给大家提供一点参考。降ai辅写 以下是针对论文AI辅写率高的情况,提供一些修改建议和技巧,可以借助此类工具: 还有: 文言一心与文心一言:究竟有何不同? 当我们谈论自然语言处理领域的两

    2024年03月16日
    浏览(56)
  • React和Vue的生态系统有何不同?

    React和Vue是目前最受欢迎的前端框架之一,它们都拥有庞大而活跃的社区生态系统。 React生态系统特点: 社区活跃度高:React拥有庞大的开发者社区,社区成员数量众多,教程、博客、插件和工具等资源丰富。 生态系统丰富:React周边有很多优秀的第三方库和插件,例如Reac

    2024年01月24日
    浏览(36)
  • Linux 上的 Wayland 是什么?它与 X 有何不同?

    导读 Wayland 是 Linux 发行版的替代窗口系统。它取代了老化的 X11 标准。由于它需要修改应用程序才能使用它,因此迄今为止采用速度很慢。在撰写本文时,增强的安全性是相对于 X11 的主要优势。 X11 或 X Window 系统可让您的图形桌面环境显示和控制窗口。 Wayland 是 X11 的替代

    2024年01月21日
    浏览(50)
  • 上证50etf 期权与其他期权品种有何不同?

    进入期权市场之后,了解期权品种之间的区别是很重要的。特别是对于在场内ETF期权交易来说,沪深300ETF期权是上证50ETF期权之后第二个上市的期权品种。了解这两者之间的区别对期权交易的帮助是非常大那么上证50etf 期权与其他期权品种有何不同? 本文来自:期权酱 一、什

    2024年02月03日
    浏览(55)
  • 创建维基WIKI百科和建立百度百科有何不同?

    很多企业有出口业务,想在互联网上开展全球性网络营销,维基百科往往被认为是开展海外营销的第一站。其作用相当于开展国内网络营销的百度百科,经常有些企业给小马识途营销顾问提供的词条内容就是百度百科的内容,可事实上两个平台的规则差异很大,在百度百科上

    2024年02月15日
    浏览(53)
  • JS 动画 vs CSS 动画:究竟有何不同?

    在 Web 前端开发中,动画是提高用户体验的关键因素之一。我们通常可以使用 JavaScript(JS)和 CSS 来创建动画效果。但是,这两者之间有哪些区别呢?在本文中,我们将深入研究 JS 动画和 CSS 动画,探讨它们的异同,以及何时使用哪一种。 CSS 动画是使用 CSS 样式属性来定义的

    2024年02月12日
    浏览(48)
  • 相比传统ERP,基于项目的ERP系统有何不同?

    服务型企业是独特的以人为本的组织,依靠员工来销售、配置和提供一系列的产品和服务,这通常是以项目或合同为基础。 在这样一个环境中,服务型企业的基本财务要求与传统的制造和供应链型企业有很大的不同。 基于项目的企业需要管理资源(人)和项目(任务)的功

    2024年02月15日
    浏览(33)
  • K3S和 K8S 有何不同?

    K3s 是CNCF 认证的 Kubernetes 发行版和Sandbox项目,专为低资源环境而设计。由 Rancher Labs 维护着 K3s。 总的来说,K3s 提供了一个开销较小的 Kubernetes 集群设置,但仍然集成了 K8s 的大部分架构和功能。 以下是 K3s 成为轻量级发行版的原因: 打包为具有最小外部依赖性的单个二进制

    2023年04月09日
    浏览(42)
  • 什么是Docker的容器编排工具,它们之间有何不同?

    随着Docker容器技术的广泛应用,容器编排工具成为了自动化部署、扩展和管理容器化应用程序的关键组件。这些工具提供了一种抽象层,帮助开发者和管理员更高效地管理大量的Docker容器,确保它们在不同的主机和环境中能够可靠地运行。目前,市场上流行的Docker容器编排工

    2024年02月19日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包