一文带你初识---虚拟dom

好久没有来博客了,疫情期间3月中旬从杭州实习公司辞职,在杭州的出租房呆了两个月,准备毕设和毕业相关的材料,顺便找新的工作。最终还是留在了魔都这座城市。现在也算稳定下来了,准备以后好好维护一下博客。第一篇文章就以虚拟DOM作为起点吧。

虚拟dom原理

1、为什么要使用虚拟dom

当浏览器内核接接收到HTML文件之后做了那些事情?
1、解析HTMl元素,生成对应的DOM树。
2、解析CSS文件,生成页面css规则树(Style Rules)。
3、将CSS树和DOM相关联起来,生成Render树。
4、布局(layout/reflow:重排),浏览器会为Render树上的每个节点确定在屏幕上的尺寸、位置。
5、paint:绘制Render树,绘制页面像素信息到屏幕上当我们使用原生js去操作DOM节点的时候,浏览器会去把整个过程重新走一遍,耗时耗力。
虚拟DOM的作用就是使用javascript对象表示virtual node(VNode),
根据VNode计算出真实DOM需要做的最小变动,然后再操作真实DOM节点,提高渲染效率。

image

跨平台:Virtual DOM 是以 JavaScript 对象为基础而不依赖真实平台环境

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9P4zcopy-1600676864444)(https://segmentfault.com/img/bVLU2p?w=623&h=396)]

2、原理主要流程

  • 用JavaScript模拟DOM树,并渲染这个DOM树

  • 比较新老DOM树,得到比较的差异对象

  • 把差异对象应用到渲染的DOM树。

image

3、如何用 JavaScript 对象来表现一个 DOM 元素的结构

<div class='box' id='content'><div class='title'>Hello</div><button>Click</button>
</div>对应:{tag: 'div',attrs: { className: 'box', id: 'content'},children: [{tag: 'div',arrts: { className: 'title' },children: ['Hello']},{tag: 'button',attrs: null,children: ['Click']}]
}

4、diff算法(先序深度优先)

  • 遍历算法
<div><div><p>I am P</p></div><ul><li>#list1</li><li><span>#list2</span></li></ul>
</div>

image

  1. 先序深度优先(根左右):
    结果:ABDCEFG
  2. 中序深度优先(左根右):
    结果:BDAECFG
  3. 后序深度优先(左右根):
    结果:DBEGFCA
  • diff算法

    在标准dom机制下:在同一位置对比前后的dom节点,发现节点改变了,会继续比较该节点的子节点,一层层对比,找到不同的节点,然后更新节点。

    在react的diff算法下,在同一位置对比前后dom节点,只要发现不同,就会删除操作前的dom节点(包括其子节点),替换为操作后的dom节点。

传统diff算法(时间复杂度 O(n^3)):

image

比如左侧树a节点依次进行如下对比,左侧树节点b、c、d、e亦是与右侧树每个节点对比
算法复杂度能达到O(n^2),n代表节点的个数a->e、a->d、a->b、a->c、a->a查找完差异后还需计算最小转换方式,最终达到的算法复杂度是O(n^3)[link](https://www.zhihu.com/question/66851503/answer/246766239)

优化后的diff算法(时间复杂度 O(n)):

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BrtxRM4m-1600676864451)(https://segmentfault.com/img/bVSLSc?w=576&h=318)]

在同一位置对比前后dom节点,只要发现不同,就会删除操作前的domm节点(包括其子节点),替换为操作后的dom节点。diff策略:策略一、Web UI中DOM节点跨层级的移动操作特别少,可以忽略不计。(tree diff)策略二、拥有相同类的两个组件将会生成相似的树形结构,拥有不同类的两个组件将会生成不同的树形结构。(component diff)策略三、对于同意层级的一组子节点,他们可以通过唯一id进行区分。(element diff)

tree diff:

  • 只会比较同一层级的DOM节点
  • 当发现当前节点不存在时,移除当前节点及其子节点
    image

comonent diff:

  • 如果是同类型的组件,则按照策略继续向下比较
    (对于同一类型的组件,有可能它的virtual Dom没有发生变化,如果可已确切知道没有变化,可无需进行diff算法分析:shouldComponentUpdate(nextProps, nextState))
  • 如果是不同类型的组件,直接替换整个组件下的所有子节点
    image

element diff:

image

1、首先遍历新集合,通过唯一的key来判断新旧集合中是否存在相同的节点,若存在则通过顺序优化手段进行移动操作,若不存在则新增。
2、当完成新集合中所有节点差异化对比后,再次遍历旧集合,判断是否有新集合中不存在但旧集合中存在的点,进行删除操作。

image)

5、patch

经过上面的diff算法,最终我们会得到对应的差异对象

差异对象结构:{type,vdom,props: [{key,type,value}],children}

最外层的type对应四种操作:新建、删除、替换、更新:

const nodePatchType = {CREATE: 'create node',REMOVE: 'remove node',REPLACE: 'replace node',UPDATE: 'update node'
}

props type对应两种操作:更新删除

const propPatchTypes = {REMOVE: 'remove prop',UPDATE: 'update prop'
}
  • 创建新增节点

  • 删除已废弃的节点

  • 修改需要更新的节点。

image

代码参考地址:https://www.php.cn/js-tutorial-411406.html

Key的作用list-diff源码:https://www.npmjs.com/package/list-diff2 或 https://blog.csdn.net/yang00322/article/details/77943548?utm_source=blogxgwz5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/515542.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

漫画通信:一图看懂通信发展史

原文链接 本文为云栖社区原创内容&#xff0c;未经允许不得转载。

为什么要使用 Kubernetes 准入控制器

Kubernetes 准入控制器是什么&#xff1f;为什么要使用准入控制器&#xff1f;如何使用&#xff1f;本文对 Kubernetes 准入控制器进行了详细解释。来源 | K8sMeetup作者 | Arun Prasad头图 | 下载于视觉中国Kubernetes 控制平面由几个组件组成。其中一个组件是 kube-apiserver…

HTTP系列学习(笔记二):HTTPS与HTTP的区别在哪?

图文详解&#xff1a; 对称加密 &#xff1a;加密与解密的算法一样 非对称加密&#xff1a;加密与解密的算法不同 加密算法&#xff1a; 明文 -> encode 加密 -> 密文 -> decode 解密 -> 明文 摘要算法&#xff1a; 加密后得到固定长度的摘要&#xff0c;无法解…

程序员晒元宵节福利,网友:看了我想砸键盘......

再过几天就到元宵节了&#xff0c;又到了互联网大厂晒福利、拉仇恨的时候了。小编在脉脉上看到许多不愿透露姓名的网友的爆料&#xff0c;一起来看看吧。有的网友说收到了汤圆&#xff0c;还有员工说收到了四盒草莓&#xff0c;但是还有网友透露自己喜提加班&#xff0c;更有甚…

深度解读OpenYurt:从边缘自治看YurtHub的扩展能力

作者 | 新胜 阿里云技术专家 导读&#xff1a;OpenYurt 开源两周以来&#xff0c;以非侵入式的架构设计融合云原生和边缘计算两大领域&#xff0c;引起了不少行业内同学的关注。阿里云推出开源项目 OpenYurt&#xff0c;一方面是把阿里云在云原生边缘计算领域的经验回馈给开源…

HTTP系列学习(笔记一):一文带你详解HTTP协议

1、什么是协议 计算机中的协议和现实生活中的协议是一样的&#xff0c;一式多份&#xff0c;彼此都遵从共同的一个规范&#xff0c;这个规范就可以称之为协议。 2、HTTP协议的工作流程 3、HTTP请求信息和响应信息的格式 请求&#xff1a; 响应&#xff1a; 常见状态码&…

阿里高级技术专家总结6年来的成长和收获

7月9日 19:00-21:30 阿里云开发者社区首场“Offer 5000”直播开启&#xff01;15位团队技术大牛在线招人&#xff0c;更有《阿里云技术面试红宝书》助你拿下Offer&#xff01;点击图片或戳我查看详情和投简历 作者 | 箫逸 阿里文娱高级技术专家 导读&#xff1a;转眼 2020 已…

一目了然的 Docker 环境配置指南

来源 | Datawhale作者 | Tianchi头图 | 下载于视觉中国Docker是一个开源的引擎&#xff0c;可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署&#xff0c;包括VMs&#xff08;虚拟机&#xff0…

阿里本地生活EMonitor根因分析大揭秘

背景 阿里集团针对故障处理提出了“1/5/10”的目标-- 1 分钟发现、5 分钟定位、10 分钟恢复&#xff0c;这对我们的定位能力提出了更高的要求。 EMonitor 是一款集成 Tracing 和 Metrics、服务于饿了么所有技术部门的一站式监控系统&#xff0c;其覆盖了 前端监控、接入层监…

uniapp 打包安卓 Android 抖音app 前端篇~01

文章目录一、配置1. 修改后端服务地址2. 基础配置3. App图标配置4. App启动页面配置5. App模块配置二、发行2.1. 云打包2.2. 云打包配置2.3. 下载app三、安装apk3.1. 下载apk3.2. 安装apk3.3. 打开app3.4. 同意协议3.5. 前端页面效果一、配置 1. 修改后端服务地址 2. 基础配置…

踩着七彩祥云来接你的不一定是意中人,也可能是阿里云

你今天点外卖了吗&#xff1f;你今天剁手了吗&#xff1f; 你每次在饿了么和淘宝上的刷刷刷、点点点 都有阿里云服务器ECS在云端疯狂计算 ——阿里云ECS&#xff0c;支撑了阿里经济体全面上云—— ---- 天猫双11核心系统100%上云 阿里云征服史上最大流量洪峰 饿了么100%迁至阿…

深度思考 Spring Cloud + Alibaba Sentinel 源码原理

随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点&#xff0c;从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。作者 | 向寒 / 孙玄来源 | 架构之美头图 | 下载于视觉中国关于 Sentinel 1、理论篇以下是经过多年分…

WORDPRESS付费会员插件Paid Memberships Pro v2.12.5 – Plugin + All Addons

WORDPRESS付费会员插件Paid Memberships Pro v2.12.5 – Plugin All Addons 简介&#xff1a; Paid Memberships Pro是一款功能强大的会员订阅和内容限制管理插件&#xff0c;适用于WordPress网站。它提供了丰富的特性和工具&#xff0c;帮助网站所有者轻松地创建和管理付费…

云计算与星辰大海的结合

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 今年在疫情的影响下&#xff0c;各国的经济发展都遇到了一些困难&#xff0c;甚至除中国以外的主要经济体都会进入了负增长的…

uniapp 打包安卓 Android 抖音app 后端篇~02

文章目录1. 中间件配置2. 云短信配置1. 中间件配置 2. 云短信配置

从开源自治到微服务云化,用这剂良药提升微服务幸福感

前言 微服务发展至今&#xff0c;因其高内聚、低耦合等特性&#xff0c;以及诸多开源方案带来的开放性&#xff0c;已成为提升架构效率的最佳实践之一。当一项技术或一个框架成为事实标准之后&#xff0c;我们会把更多的注意力聚焦在运维效率和应用可用性的持续提升上。相信下…

uniapp 打包安卓 Android 抖音app 前后端调试篇~03

文章目录1. 未登录首页浏览短视频2. 发布视频-云短信登录3. 发布选择视频4. 上传短视频到云存储5. 测试发布视频6. 个人中心查看发布视频7. 首页查看刚发布视频8. 个人中心1. 未登录首页浏览短视频 在未登录的情况下&#xff0c;首页可以看短视频 2. 发布视频-云短信登录 点…

俯瞰云原生,这便是供应层

来源 | K8sMeetup社区作者 | Catherine Paganini&#xff0c;Jason Morgan头图 | 下载于视觉中国在都在说云原生&#xff0c;它的技术图谱你真的了解吗&#xff1f;中&#xff0c;我们对 CNCF 的云原生技术生态做了整体的介绍。从本篇开始&#xff0c;将详细介绍云原生全景图的…

进击的Kubernetes调度系统(一):SchedulingFramework

作者&#xff1a;王庆璨 张凯 前言 Kubernetes已经成为目前事实标准上的容器集群管理平台。它为容器化应用提供了自动化部署、运维、资源调度等全生命周期管理功能。经过3年多的快速发展&#xff0c;Kubernetes在稳定性、扩展性和规模化方面都有了长足进步。 尤其是Kubernete…

HTTP系列学习(笔记三):HTTP的发展历程思维导图

HTTP&#xff08;HyperText Transfer Protocol&#xff09;是万维网&#xff08;World Wide Web&#xff09;的基础协议。 0.9版本&#xff1a; 1.0版本&#xff1a; 1.1版本&#xff1a; 2.0版本&#xff1a; 2.0进化版本&#xff1a; 为了便于浏览记忆&#xff0c;整理了一份…