Vue.js 2.0窥探之Virtual DOM到底是什么?


Posted in Javascript onFebruary 10, 2017

Virtual DOM是什么?

在之前,React和Ember早就开始用虚拟DOM技术来提高页面更新的速度了。 若想了解它是如何工作的,就要先认清这几个概念:

1.更新DOM是非常昂贵的操作

当我们使用Javascript来修改我们的页面,浏览器已经做了一些工作,以找到DOM节点进行更改,例如:

document.getElementById('myId').appendChild(myNewNode);

在现代的应用中,会有成千上万数量个DOM节点。所以因更新的时候产生的计算非常昂贵。琐碎且频繁的更新会使页面缓慢,同时这也是不可避免的。

2.我们可以用JavaScript对象来代替DOM节点

DOM节点在HTML文档中的表现通常是这样的:

<ul id='myId'>
 <li>Item 1</li>
 <li>Item 2</li>
<ul>

DOM节点也可以表示为一个JavaScript对象,就像这样:

//用Javascript代码表示DOM节点的伪代码
Let domNode = {
 tag: 'ul'
 attributes: { id: 'myId' }
 children: [
//这里是 li
 ]
};

这就是虚拟的DOM节点,很好理解吧。

3.更新虚拟节点, 并不昂贵贵

//更新虚拟DOM的代码
domNode.children.push('<ul>Item 3</ul>');

如果我们用一个虚拟DOM,而不是直接调用像.getElementById的方法,这样只操作JavaScript对象,这样是相当便宜的。

然后,再把更改的部分更新到真正的DOM,方法如下:

//这个方法是调用DOM API来更改真正DOM的
//它会分批执行从而获取更高的效率
sync(originalDomNode, domNode);

Vue.js在2.0 版本中引入虚拟DOM是一个正确的选择吗 ?

引入虚拟DOM实际上有优点也缺点。

1、尺寸

更多的功能意味着更多的代码。幸运的是Vue.js 2.0仍然是相当小的(21.4kb当前版本)。

2、内存

虚拟DOM需要在内存中的维护一份DOM的副本。在DOM更新速度和使用内存空间之间取得平衡。

3、不是适合所有情况

如果虚拟DOM大量更改,这是合适的。但是单一的,频繁的更新的话,虚拟DOM将会花费更多的时间处理计算的工作。
所以,如果你有一个DOM节点相对较少页面,用虚拟DOM,它实际上有可能会更慢。
但对于大多数单页面应用,这应该都会更快。

除了性能提升外还有什么

引入虚拟DOM,这不仅仅是一种性能增强,这同时意味着更多的功能。

例如,您可以在虚拟DOM中的 render() 方法直接创建新的节点:

new Vue({
 el: '#app',
 data: {
 message: 'hello world'
 },
 render() {
 var node = this.$createElement;
 return node(
 'div', 
 { attrs: { id: 'myId' } }, 
 this.message
 );
 }
});

输出:

<div id='app'>
 <div id='myId'>hello world</div>
</div>

为什么这样做?你可以用全编程语言JavaScript编程,您可以创建工厂式的功能来建立虚拟节点。

总结

以上就是在这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
js获取select选中的option的text示例代码
Dec 19 Javascript
JS实现带提示的星级评分效果完整实例
Oct 30 Javascript
分享15个大家都熟知的jquery小技巧
Dec 02 Javascript
动态统计当前输入内容的字节、字符数的实例详解
Oct 27 Javascript
jQuery niceScroll滚动条错位问题的解决方法
Feb 03 jQuery
学习JS中的DOM节点以及操作
Apr 30 Javascript
vue数组对象排序的实现代码
Jun 20 Javascript
详解js中Array的方法及技巧
Sep 12 Javascript
使用NestJS开发Node.js应用的方法
Dec 03 Javascript
js中事件对象和事件委托的介绍
Jan 21 Javascript
微信小程序页面间传递数组对象方法解析
Nov 06 Javascript
JavaScript 浏览器对象模型BOM原理与常见用法实例分析
Dec 16 Javascript
BootStrap Datepicker 插件修改为默认中文的实现方法
Feb 10 #Javascript
BootStrap Datetimepicker 汉化的实现代码
Feb 10 #Javascript
解决URL地址中的中文乱码问题的办法
Feb 10 #Javascript
tablesorter.js表格排序使用方法(支持中文排序)
Feb 10 #Javascript
jquery.tableSort.js表格排序插件使用方法详解
Aug 12 #Javascript
TableSort.js表格排序插件使用方法详解
Feb 10 #Javascript
微信小程序 JS动态修改样式的实现代码
Feb 10 #Javascript
You might like
第九节--绑定
2006/11/16 PHP
Dedecms V3.1 生成HTML速度的优化办法
2007/03/18 PHP
表单复选框向PHP传输数据的代码
2007/11/13 PHP
解析Win7 XAMPP apache无法启动的问题
2013/06/26 PHP
PHP加Nginx实现动态裁剪图片方案
2014/03/10 PHP
smarty模板局部缓存方法使用示例
2014/06/17 PHP
php中adodbzip类实例
2014/12/08 PHP
eclipse php wamp配置教程
2016/06/30 PHP
jQuery的一些特性和用法整理小结
2010/01/13 Javascript
5个javascript的数字格式化函数分享
2011/12/07 Javascript
js中return false(阻止)的用法
2013/08/14 Javascript
jQuery实现按钮的点击 全选/反选 单选框/复选框 文本框 表单验证
2015/06/25 Javascript
javascript实现拖放效果
2015/12/16 Javascript
JS实现复制内容到剪贴板功能兼容所有浏览器(推荐)
2016/06/17 Javascript
React简单介绍
2017/05/24 Javascript
angular 实现的输入框数字千分位及保留几位小数点功能示例
2018/06/19 Javascript
vue watch关于对象内的属性监听
2019/04/22 Javascript
[01:11:11]Alliance vs RNG 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
[06:59]DOTA2-DPC中国联赛3月7日Recap集锦
2021/03/11 DOTA
python的几种开发工具介绍
2007/03/07 Python
介绍Python中的一些高级编程技巧
2015/04/02 Python
pandas apply 函数 实现多进程的示例讲解
2018/04/20 Python
pandas 数据索引与选取的实现方法
2019/06/21 Python
python实现矩阵和array数组之间的转换
2019/11/29 Python
python路径的写法及目录的获取方式
2019/12/26 Python
Python接口测试环境搭建过程详解
2020/06/29 Python
python爬虫泛滥的解决方法详解
2020/11/25 Python
巴西一家专门从事家居和装饰的连锁店:Camicado
2019/08/14 全球购物
求职自我评价范文100字
2014/09/23 职场文书
毕业生代领毕业材料的授权委托书
2014/09/29 职场文书
交通事故赔偿协议书怎么写
2014/10/04 职场文书
2016元旦晚会主持词
2015/07/01 职场文书
环保建议书范文
2015/09/14 职场文书
《弟子规》读后感:知廉耻、明是非、懂荣辱、辨善恶
2019/12/03 职场文书
如何使用PyCharm及常用配置详解
2021/06/03 Python
spring 项目实现限流方法示例
2022/07/15 Java/Android