框架并没有提高web的性能,只是让开发者更加专注的完成业务逻辑,而不用过渡的考虑性能上的优化。如果以性能来比的话,框架是绝对比不过优化后的原生代码的。

二、什么是Virtual DOM

Virtual DOM的概念有很多解释,从我的理解来看,主要是三个方面,分别是:一个对象,两个前提,三个步骤。

一个对象指的是Virtual DOM是一个基本的JavaScript对象,也是整个Virtual DOM树的基本。

两个前提分别是JavaScript很快和直接操作DOM很慢,这是Virtual DOM得以实现的两个基本前提。得益于V8引擎的出现,让JavaScript可以高效地运行,在性能上有了极大的提高。直接操作DOM的低效和JavaScript的高效相对比,为Virtual DOM的产生提供了大前提。

三个步骤指的是Virtual DOM的三个重要步骤,分别是:生成Virtual DOM树、对比两棵树的差异、更新视图。这三个步骤的具体实现也是本文将简述的一大重点。

五、进一步思考

Virtual DOM的原理和实现的说明已经结束了,但是对于Virtual DOM的思考远没有结束,Virtual DOM 对前端开发的影响难道就只是一堆算法吗?

1、性能对比

首先,先来看一下性能,在诸多的Virtual DOM实现中,都会强调算法的高效,那么在实际的使用中,Virtual DOM的性能到底如何呢?

上图是对一个简单的DOM树进行不同方式的操作,由左边的结构更新为右边的结构,通过原生操作、jQuery、Virtual DOM和React四种方式,在Chrome的timeline中得到的性能对比,在这个图中,我们并没有看出Virtual DOM或者React的优势,通过对比我们发现,原生的操作要比其他三种方式快,而其他三种方式就相差无几了。当然,这样一个简单测试并没有说明什么,测试的DOM结构简单,和我们平时面对的业务场景不是一个量级,代表不了什么,但是起码我们可以看到,这种情况下好像Virtual DOM并没有我们想象的性能优势。

在接下来的测试中我们增加测试量。上图分别是使用原生操作、Virtual DOM和React三种方式进行两类测试:插入10000个节点100次和修改3000个节点的属性100次。分别取这100次的耗时最大值、最小值和平均值。从图中我们可以看到明显的差异,Virtual DOM和React的差异可以理解,毕竟我们自己实现的Virtual DOM没有那么庞大,只是针对虚拟DOM而实现的,比React快一点可以理解,但是原生的操作比Virtual DOM和React都要快得多,这又是怎么一回事,好像和我们预想的不一样,回到最初,我们提到,Virtual DOM的产生前提之一就是直接操作DOM很,现在看来直接操作不但不慢,反而快了很多,这不得不让我产生了怀疑,是我对Virtual DOM的理解有误还是对DOM的理解有误呢?

2、再次审视Virtual DOM

框架存在的意义是什么?是提高性能?提高开发效率?亦或是其他用途,每个人对框架的理解不同,答案也不尽相同。但是不得不承认,存在框架的情况下,项目的可维护性有了极大的提高,而对于其他方面就要做出牺牲,比如性能。在上面的性能测试中,其实完全走入了一个误区,在测试中我们用到的原生的操作其实是“人为”地对操作进行优化之后的结果,而如果抛开人为优化的前提,最终的结果可能就不是这样了。**Virtual DOM的优势不在于单次的操作,而是在大量、频繁的数据更新下,能够对视图进行合理、高效的更新。**这一点是原生操作远远无法替代的。

到此为止,再次审视Virtual DOM,可以简单得出如下结论:

  • Virtual DOM 在牺牲部分性能的前提下,增加了可维护性,这也是很多框架的通性
  • 实现了对DOM的集中化操作,在数据改变时先对虚拟DOM进行修改,再反映到真实的DOM中,用最小的代价来更新DOM,提高效率
  • 打开了函数式UI编程的大门
  • 可以渲染到DOM以外的端,比如ReactNative

https://github.com/y8n/blog/issues/5

最新文章

  1. DEDE整站动态化或整站静态化设置方法,织梦栏目批量静态/动态方法
  2. git入门学习
  3. ASP.NET + SqlSever 大数据解决方案 PK HADOOP
  4. API接口验证
  5. [转]mongodb与mysql相比的优缺点
  6. ubuntu14.0安装arm-linux-gcc交叉编译环境
  7. 二模10day1解题报告
  8. 关于 Google Chrome 中的全屏模式和 APP 模式
  9. struts2 下载时报java.lang.IllegalStateException
  10. nodejs的mysql模块学习(四)断开数据库连接
  11. python 元组问题解决
  12. SqlHelper 简单版
  13. 纯CSS隔行换色
  14. Jfinal——实践出真知
  15. CentOS修改root密码
  16. LCT 模板及套路总结
  17. U68364 _GC滑迷宫
  18. open-falcon ---安装Dashboard时候报错"SSLError: The read operation timed out"
  19. java使用JMail通过QQ邮件服务器实现自动发送邮件
  20. HDU 2072 单词数 详细解答

热门文章

  1. 高性能TcpServer(C#) - 4.文件通道(处理:文件分包,支持断点续传)
  2. LeetCode——Nth Highest Salary
  3. 99%的程序都没有考虑的网络异常?使用Fundebug.notify()主动上报
  4. Spring Cloud Eureka详细说明
  5. Prometheus node_exporter grafana部署安装
  6. 其他综合-CentOS 7 使用二进制包搭建lnmp平台
  7. 02-MySQL 介绍和安装
  8. 跟着ALEX 学python day2 基础2 模块 数据类型 运算符 列表 元组 字典 字符串的常用操作
  9. uiautomator输入中文实例
  10. golang 登录