CN106599016A - 一种基于虚拟dom的前端元素维护方法 - Google Patents
一种基于虚拟dom的前端元素维护方法 Download PDFInfo
- Publication number
- CN106599016A CN106599016A CN201610872082.8A CN201610872082A CN106599016A CN 106599016 A CN106599016 A CN 106599016A CN 201610872082 A CN201610872082 A CN 201610872082A CN 106599016 A CN106599016 A CN 106599016A
- Authority
- CN
- China
- Prior art keywords
- difference
- node
- dom
- attribute
- virtual
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/95—Retrieval from the web
- G06F16/958—Organisation or management of web site content, e.g. publishing, maintaining pages or automatic linking
- G06F16/986—Document structures and storage, e.g. HTML extensions
Abstract
本发明公开了一种基于虚拟DOM的前端元素维护方法。它包括以下步骤:1)扫描初始DOM树,生成初始虚拟DOM树。2)当DOM树改变后,生成新的虚拟DOM树。3)对于同属一个父元素的虚拟DOM节点的变化,通过列表对比算法求取操作量最小的操作顺序,并将目标操作记录在差异对象patch中,并将差异对象添加到差异数组patches中。4)对于新老虚拟DOM树上对应的同一个虚拟DOM节点,比较其节点类型差异,并将目标修改方法记录在差异对象中返回,并将差异对象patch添加到差异数组patches中。5)重新对旧的DOM树进行深度优先遍历,对原有界面元素进行修改。本发明能够通过虚拟DOM对象的差异比较,自动找到操作量最小的DOM操作步骤,并根据记录的差异对象,实现对DOM的自动操作。
Description
技术领域
本发明涉及复杂web应用中大量前端元素数据、业务逻辑以及界面之间的管理,尤其涉及一种双向数据绑定的特性。它能够确保当界面内容变化时,绑定的数据随之变化;而数据变化时,界面内容也同时发生变化,从而实现对web应用中数据、界面以及它们之间复杂相互依赖关系的管理。它利用先进的前端工程技术,简化了前端开发人员的工作,提高了前端开发和前端维护的效率。
背景技术
伴随着“web3.0”的浪潮,facebook、微博等各类大型web应用走向成熟,其程序的框架插件众多、体系繁复,复杂度达到了一个新的水准,往往让开发维护无所适从。在众多的前端操作中,DOM操作是最消耗浏览器资源的一项。在大型复杂web应用中,随着数据的变化和业务过程的推进,大量无法避免的DOM操作随之产生。不恰当的DOM操作容易造成界面频繁且无意义的重排重绘,造成计算资源的极大损耗与浪费。MVVM框架实现了数据和界面的双向绑定,DOM操作虽然实现了自动化,但是其操作数并没有减少,仍存在大量无意义且重复的DOM操作。如何优化DOM操作,得到总体操作数最少,浏览器绘制效率最高的DOM操作,是亟需解决的问题。
本发明中涉及到的名词解释。
web应用:Web应用程序是一种可以通过Web访问的应用程序。Web应用程序的一个最大好处是用户很容易访问应用程序。用户只需要有浏览器即可,不需要再安装其他软件。
DOM操作:DOM对象是指对界面中html标签在浏览器内的保存形式,是对界面对象的第一层抽象。
发明内容
本发明的目的是克服现有技术的不足,提供一种计算最佳DOM操作步骤的方法。
本发明的目的是通过以下技术方案来实现的:
基于虚拟DOM的前端元素维护方法,包括如下步骤:
1)扫描初始DOM树,根据DOM树生成初始虚拟DOM树;
2)当DOM树改变后,根据改变后的DOM树生成新的虚拟DOM树;
3)对于同属一个父元素的虚拟DOM节点的移动、删除和新增变化,通过列表对比算法求取操作量最小的移动、插入、删除操作顺序,并将目标操作记录在差异对象patch中,并将差异对象添加到差异数组patches中;
4)对于新老虚拟DOM树上对应的同一个虚拟DOM节点,比较其节点类型替换、属性变化、文本变化这三类差异,并将目标修改方法记录在差异对象中返回,并将差异对象patch添加到差异数组patches中;
5)重新对旧的DOM树进行深度优先遍历,遍历时根据具体的差异对象对原有界面元素进行修改。
上述方案中,各步骤可采用如下具体方法:
步骤1)和步骤2)具体如下:(1)获取需要进行维护的DOM树根节点,作为扫描起点;(2)利用深度遍历算法扫描DOM树;(3)对于每次扫描到的DOM节点,创建js对象,并记录该DOM节点的节点类型,属性以及子节点,作为该js对象的属性;该js对象为一个虚拟DOM节点;(4)对于每次扫描到的DOM节点,记录其节点位置并进行编号,该编号也作为虚拟DOM节点的一个属性。
步骤3)具体包括:
(1)将两组同属一个父元素的虚拟DOM节点线性排布,并新建差异数组patches;
(2)采用解决字符串最小编辑距离问题的levenshtein distance算法进行动态规划求解,计算出操作量最小的,对该父节点下所有虚拟DOM进行移动、插入、删除修改操作的操作步骤;
(3)新建差异对象patch,记录差异类型编号为1;
(4)新建remove数组,将具体的修改操作按顺序插入remove数组,并将remove数组其作为该差异对象的属性;remove数组中如果有记录新插入节点的操作,则该节点也用虚拟DOM的形式记录;
(5)将其父元素的编号作为差异对象的编号,并将该差异对象插入差异数组patches中。
步骤4),具体包括:
(1)比较相同位置节点的节点类型,如果节点类型不同,则视为发生替换差异;
(2)依次比较相同位置节点的节点属性,如果节点属性发生变化,则视为发生属性变化差异,属性变化差异分为属性新增、属性删除和属性修改;
(3)比较相同位置节点的文本内容,如果文本内容不同,则视为发生文本变化差异;
(4)判断该节点是否已经存在对应的差异对象patch,如果存在,说明其已经在步骤3)中被创建;如果不存在,则新建差异对象;
(5)根据前三种差异类型,分别记录差异类型编号为2、3、4;将差异内容分别记录为newNode对象、prop对象、content对象,这三个对象分别保存新的虚拟DOM节点,新属性列表以及新的文本内容;再将这三个对象作为差异对象的属性;
(6)将该元素本身的编号作为该差异对象的编号,并将该差异对象插入差异数组patches中。
步骤5)具体包括:
(1)再次对旧虚拟DOM树进行深度优先遍历;
(2)对于每次遍历到的节点,通过其节点编号,从差异数组patches中调出对应的差异对象;
(3)根据差异对象中记录的虚拟DOM节点,创建实际DOM对象;
(4)根据差异对象中描述的差异类型和修改方法,对界面中的相应DOM对象进行正式的修改:如果差异类型编号为1,则对该元素执行添加、删除和移动子元素的操作;如果差异类型为编号为2,则用新的元素来替换该元素;如果差异类型编号为3,则重新设置该节点上的属性;如果差异类型编号为4,则重新设置该属性的文本;以上操作中所有设计的新增DOM都通过步骤(3)生成。
本发明与现有技术相比具有的有益成果是:
1)DOM对象包含大量W3C标准要求的属性和事件挂载,操作效率很低,但是单纯js对象的操作效率则很高。本发明利用单纯js对象作为虚拟DOM对象,以对虚拟DOM对象的计算和操作取代对DOM的直接操作,提高了计算效率。在界面分成了20个逻辑区域,每个区域50个元素DOM对象,一次更新20个逻辑区域的测试条件下,本发明的方法比操作传统DOM对象的方法节省了约50%的操作时间。传统DOM对象和虚拟DOM对象的比较如表1所示。
表1 DOM对象和虚拟DOM对象比较表
2)直接的DOM操作具有一定的盲目性,譬如直接用旧的视图更换掉旧的视图,就容易造成无谓的页面重排重绘,耗费浏览器资源。本发明通过虚拟DOM对象这一桥梁计算出最佳的DOM操作步骤,实现浏览器负载最小的DOM操作方案。
附图说明
图1是一种实现本发明的流程图。
图2为新老虚拟DOM树上对应的同一个虚拟DOM节点的差异比较示意图。
具体实施方式
下面结合附图和具体实施例对本发明作进一步详细说明。
本发明提出的基于虚拟DOM的前端元素维护方法,具体步骤如下:
1)扫描初始DOM树,根据DOM树生成初始虚拟DOM树。
2)当DOM树改变后,根据改变后的DOM树生成新的虚拟DOM树。
3)对于同属一个父元素的虚拟DOM节点的移动、删除和新增变化,通过列表对比算法求取操作量最小的移动、插入、删除操作顺序,并将目标操作记录在差异对象patch中,并将差异对象添加到差异数组patches中。
4)对于新老虚拟DOM树上对应的同一个虚拟DOM节点,比较其节点类型替换、属性变化、文本变化这三类差异,并将目标修改方法记录在差异对象中返回,并将差异对象patch添加到差异数组patches中。
5)重新对旧的DOM树进行深度优先遍历,遍历时根据具体的差异对象对原有界面元素进行修改。
各步骤的具体实现如下:
所述的步骤1)和步骤2)包括:
(1)获取需要进行维护的DOM树根节点,作为扫描起点。(2)利用深度遍历算法扫描DOM树。(3)对于每次扫描到的DOM节点,创建js对象,并记录该DOM节点的节点类型(如div、p、h等),属性(class、id、name等)以及子节点(如为文本节点,则直接记录文本),作为该js对象的属性。该js对象就是一个虚拟DOM节点(4)对于每次扫描到的DOM节点,记录其节点位置并进行编号,该编号也作为虚拟DOM节点的一个属性。
所述的步骤3)包括:
(1)将两组同属一个父元素的虚拟DOM节点线性排布,并新建差异数组patches。
(2)采用解决字符串最小编辑距离(字符串相似度)问题的算法:levenshteindistance算法进行动态规划求解,计算出操作量最小的,对该父节点下所有虚拟DOM进行移动、插入、删除等修改操作的操作步骤。
(3)新建差异对象patch,记录差异类型编号为1(reorder)。
(4)新建remove数组,将具体的修改操作按顺序插入remove数组,并将remove数组其作为该差异对象的属性。remove数组中如果有记录新插入节点的操作,则该节点也用虚拟DOM的形式记录。
(5)将其父元素的编号作为差异对象的编号,并将该差异对象插入差异数组patches中。
所述的步骤4)包括:
(1)比较相同位置节点的节点类型,如果节点类型不同,则视为发生了节点替换差异。
(2)依次比较相同位置节点的节点属性,如果节点属性发生了变化,则视为发生了属性变化差异,属性变化差异又细分为属性新增、属性删除和属性修改。
(3)比较相同位置节点的文本内容,如果文本内容不同,则视为发生了文本变化差异。
(4)判断该节点是否已经存在对应的差异对象patch,如果存在,说明其已经在步骤3)中被创建。如果不存在,则新建差异对象。
(5)根据前三种差异类型,分别记录差异类型编号为2(replace)、3(prop)、4(text)。将差异内容分别记录为newNode对象、prop对象、content对象(键名),这三个对象分别保存新的虚拟DOM节点,新属性列表以及新的文本内容。将这三个对象作为差异对象的属性。
(6)将该元素本身的编号作为该差异对象的编号,并将该差异对象插入差异数组patches中。
所述的步骤5)包括:
(1)再次对旧虚拟DOM树进行深度优先遍历。
(2)对于每次遍历到的节点,通过其节点编号,从差异数组patches中调出对应的差异对象。
(3)根据差异对象中记录的虚拟DOM节点,创建实际DOM对象。
(4)根据差异对象中描述的差异类型和修改方法,对界面中的相应DOM对象进行正式的修改。如果差异类型编号为1,则对该元素执行添加、删除和移动子元素的操作。如果差异类型为编号为2,则用新的元素来替换该元素。如果差异类型编号为3,则重新设置该节点上的属性。如果差异类型编号为4,则重新设置该属性的文本。以上操作中所有设计的新增DOM都通过步骤(3)生成。
基于上述方法,进一步通过实施例对其进行说明,各步骤中部分参数及结果如下:
第一步,扫描初始DOM树,根据DOM树生成初始虚拟DOM树。
第二步,当DOM树改变后,根据改变后的DOM树生成新的虚拟DOM树。前两步代码如下:
第三步,对于同属一个父元素的虚拟DOM节点的移动、删除和新增变化,通过列表对比算法求取操作量最小的移动、插入、删除操作顺序,并将目标操作记录在差异对象patch中,并将差异对象添加到差异数组patches中。
第四步,对于新老虚拟DOM树上对应的同一个虚拟DOM节点,比较其节点类型替换、属性变化、文本变化这三类差异,并将目标修改方法记录在差异对象中返回,并将差异对象patch添加到差异数组patches中。其比较过程如图2所示。根据三种情况,其主要代码为:
所有差异类型及其代码如表2所示:
表2差异类型表
第五步,重新对旧的DOM树进行深度优先遍历,遍历时根据具体的差异对象对原有界面元素进行修改。主要方法为:
由此,该方法通过虚拟DOM对象的差异比较,自动找到操作量最小的DOM操作步骤,并根据记录的差异对象,实现对DOM的自动操作。和基于数据双向绑定的MVVM框架结合,能够实现前端的自动化架构和维护。
Claims (5)
1.一种基于虚拟DOM的前端元素维护方法,其特征在于,包括如下步骤:
1)扫描初始DOM树,根据DOM树生成初始虚拟DOM树;
2)当DOM树改变后,根据改变后的DOM树生成新的虚拟DOM树;
3)对于同属一个父元素的虚拟DOM节点的移动、删除和新增变化,通过列表对比算法求取操作量最小的移动、插入、删除操作顺序,并将目标操作记录在差异对象patch中,并将差异对象添加到差异数组patches中;
4)对于新老虚拟DOM树上对应的同一个虚拟DOM节点,比较其节点类型替换、属性变化、文本变化这三类差异,并将目标修改方法记录在差异对象中返回,并将差异对象patch添加到差异数组patches中;
5)重新对旧的DOM树进行深度优先遍历,遍历时根据具体的差异对象对原有界面元素进行修改。
2.根据权利要求1所述的方法,其特征在于所述的步骤1)和步骤2),具体如下:(1)获取需要进行维护的DOM树根节点,作为扫描起点;(2)利用深度遍历算法扫描DOM树;(3)对于每次扫描到的DOM节点,创建js对象,并记录该DOM节点的节点类型,属性以及子节点,作为该js对象的属性;该js对象为一个虚拟DOM节点;(4)对于每次扫描到的DOM节点,记录其节点位置并进行编号,该编号也作为虚拟DOM节点的一个属性。
3.根据权利要求1所述的方法,其特征在于步骤3)具体包括:
(1)将两组同属一个父元素的虚拟DOM节点线性排布,并新建差异数组patches;
(2)采用解决字符串最小编辑距离问题的levenshtein distance算法进行动态规划求解,计算出操作量最小的,对该父节点下所有虚拟DOM进行移动、插入、删除修改操作的操作步骤;
(3)新建差异对象patch,记录差异类型编号为1;
(4)新建remove数组,将具体的修改操作按顺序插入remove数组,并将remove数组其作为该差异对象的属性;remove数组中如果有记录新插入节点的操作,则该节点也用虚拟DOM的形式记录;
(5)将其父元素的编号作为差异对象的编号,并将该差异对象插入差异数组patches中。
4.根据权利要求1所述的方法,其特征在于步骤4),具体包括:
(1)比较相同位置节点的节点类型,如果节点类型不同,则视为发生替换差异;
(2)依次比较相同位置节点的节点属性,如果节点属性发生变化,则视为发生属性变化差异,属性变化差异分为属性新增、属性删除和属性修改;
(3)比较相同位置节点的文本内容,如果文本内容不同,则视为发生文本变化差异;
(4)判断该节点是否已经存在对应的差异对象patch,如果存在,说明其已经在步骤3)中被创建;如果不存在,则新建差异对象;
(5)根据前三种差异类型,分别记录差异类型编号为2、3、4;将差异内容分别记录为newNode对象、prop对象、content对象,这三个对象分别保存新的虚拟DOM节点,新属性列表以及新的文本内容;再将这三个对象作为差异对象的属性;
(6)将该元素本身的编号作为该差异对象的编号,并将该差异对象插入差异数组patches中。
5.根据权利要求1所述的方法,其特征在于步骤5)具体包括:
(1)再次对旧虚拟DOM树进行深度优先遍历;
(2)对于每次遍历到的节点,通过其节点编号,从差异数组patches中调出对应的差异对象;
(3)根据差异对象中记录的虚拟DOM节点,创建实际DOM对象;
(4)根据差异对象中描述的差异类型和修改方法,对界面中的相应DOM对象进行正式的修改:如果差异类型编号为1,则对该元素执行添加、删除和移动子元素的操作;如果差异类型为编号为2,则用新的元素来替换该元素;如果差异类型编号为3,则重新设置该节点上的属性;如果差异类型编号为4,则重新设置该属性的文本;以上操作中所有设计的新增DOM都通过步骤(3)生成。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610872082.8A CN106599016A (zh) | 2016-09-30 | 2016-09-30 | 一种基于虚拟dom的前端元素维护方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610872082.8A CN106599016A (zh) | 2016-09-30 | 2016-09-30 | 一种基于虚拟dom的前端元素维护方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN106599016A true CN106599016A (zh) | 2017-04-26 |
Family
ID=58556369
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610872082.8A Pending CN106599016A (zh) | 2016-09-30 | 2016-09-30 | 一种基于虚拟dom的前端元素维护方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106599016A (zh) |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107220439A (zh) * | 2017-05-27 | 2017-09-29 | 郑州云海信息技术有限公司 | 一种pcb设计中批量移动装配层文字的方法 |
CN108572819A (zh) * | 2017-12-21 | 2018-09-25 | 北京金山云网络技术有限公司 | 页面更新方法、装置、终端及计算机可读存储介质 |
CN109739500A (zh) * | 2018-12-14 | 2019-05-10 | 中国四维测绘技术有限公司 | 一种bs架构下的浏览器前端渲染展示方法 |
CN110166782A (zh) * | 2019-06-05 | 2019-08-23 | 上海易点时空网络有限公司 | 适用于车载多媒体的图像压缩方法及装置 |
CN110209985A (zh) * | 2019-06-05 | 2019-09-06 | 上海德拓信息技术股份有限公司 | 一种更新dom树的方法 |
US11487931B1 (en) * | 2021-10-18 | 2022-11-01 | International Business Machines Corporation | Replaying a webpage based on virtual document object model |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105630902A (zh) * | 2015-12-21 | 2016-06-01 | 明博教育科技股份有限公司 | 一种渲染和增量更新网页的方法 |
-
2016
- 2016-09-30 CN CN201610872082.8A patent/CN106599016A/zh active Pending
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105630902A (zh) * | 2015-12-21 | 2016-06-01 | 明博教育科技股份有限公司 | 一种渲染和增量更新网页的方法 |
Non-Patent Citations (1)
Title |
---|
戴嘉华: ""深度剖析:如何实现一个 Virtual DOM 算法"", 《HTTPS://SEGMENTFAULT.COM/A/1190000004029168》 * |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107220439A (zh) * | 2017-05-27 | 2017-09-29 | 郑州云海信息技术有限公司 | 一种pcb设计中批量移动装配层文字的方法 |
CN108572819A (zh) * | 2017-12-21 | 2018-09-25 | 北京金山云网络技术有限公司 | 页面更新方法、装置、终端及计算机可读存储介质 |
CN109739500A (zh) * | 2018-12-14 | 2019-05-10 | 中国四维测绘技术有限公司 | 一种bs架构下的浏览器前端渲染展示方法 |
CN110166782A (zh) * | 2019-06-05 | 2019-08-23 | 上海易点时空网络有限公司 | 适用于车载多媒体的图像压缩方法及装置 |
CN110209985A (zh) * | 2019-06-05 | 2019-09-06 | 上海德拓信息技术股份有限公司 | 一种更新dom树的方法 |
CN110209985B (zh) * | 2019-06-05 | 2023-04-07 | 上海德拓信息技术股份有限公司 | 一种更新dom树的方法 |
US11487931B1 (en) * | 2021-10-18 | 2022-11-01 | International Business Machines Corporation | Replaying a webpage based on virtual document object model |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106599016A (zh) | 一种基于虚拟dom的前端元素维护方法 | |
CN1786965B (zh) | 一种新闻网页正文信息的提取方法 | |
US8117217B2 (en) | Information processing apparatus and encoding method | |
CN105630902A (zh) | 一种渲染和增量更新网页的方法 | |
KR101617696B1 (ko) | 데이터 정규표현식의 마이닝 방법 및 장치 | |
CN102737108B (zh) | 处理流程图的方法及装置 | |
CN110737466A (zh) | 基于静态程序分析的源代码编码序列表示方法 | |
CN102867049B (zh) | 一种基于单词查找树实现的汉语拼音快速分词方法 | |
CN101872350A (zh) | 网页正文抽取方法和装置 | |
CN105095160A (zh) | 一种文档转换阅读方法与系统 | |
CN101887410A (zh) | 文件转换装置、文件转换方法以及文件转换程序 | |
CN115935944A (zh) | 一种跨平台的标准文件树形结构生成方法与展示控件 | |
CN110765402A (zh) | 一种基于网络资源的可视化采集系统及采集方法 | |
JP2002032770A (ja) | 文書処理方法、文書処理システムおよび媒体 | |
CN105956158A (zh) | 基于海量微博文本和用户信息的网络新词自动提取的方法 | |
CN101183372A (zh) | 一种样式表处理系统及方法 | |
CN112650529B (zh) | 可配置生成移动端app代码的系统及方法 | |
CN116501742A (zh) | 一种简单灵活的表格数据采集输出方法、介质及系统 | |
CN110083845A (zh) | 网页翻译方法及系统 | |
CN113609433B (zh) | 一种算式布局确定方法、装置、电子设备及存储介质 | |
CN114047926A (zh) | 数组计算表达语言的转换方法、装置、设备及存储介质 | |
CN114116779A (zh) | 基于深度学习的电网调控领域信息检索方法、系统和介质 | |
CN112948734A (zh) | 项目样式整合适配方法、装置、设备及存储介质 | |
JP3785150B2 (ja) | 頻出部分グラフ抽出装置、頻出部分グラフ抽出方法、ならびに、プログラム | |
KR20080008573A (ko) | Xml 데이터로부터 연관규칙을 추출하기 위한 방법 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20170426 |