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 相关文章推荐
Seajs的学习笔记
Mar 04 Javascript
多个checkbox被选中时如何判断是否有自己想要的
Sep 22 Javascript
JavaScript获取文本框内选中文本的方法
Feb 20 Javascript
每天一篇javascript学习小结(Function对象)
Nov 16 Javascript
JavaScript为事件句柄绑定监听函数实例详解
Dec 15 Javascript
js导出excel文件的简洁方法(推荐)
Nov 02 Javascript
浅谈React 属性和状态的一些总结
Nov 21 Javascript
基于JavaScript实现全选、不选和反选效果
Feb 15 Javascript
javascript 中select框触发事件过程的分析
Aug 01 Javascript
react路由配置方式详解
Aug 07 Javascript
详解微信小程序框架wepy踩坑记录(与vue对比)
Mar 12 Javascript
vue+element使用动态加载路由方式实现三级菜单页面显示的操作
Aug 04 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
php中eval函数的危害与正确禁用方法
2014/06/30 PHP
Laravel框架路由配置总结、设置技巧大全
2014/09/03 PHP
PHP移动文件指针ftell()、fseek()、rewind()函数总结
2014/11/18 PHP
jQuery AJAX回调函数this指向问题
2010/02/08 Javascript
JavaScript初学者需要了解10个小技巧
2010/08/25 Javascript
基于jQuery的投票系统显示结果插件
2011/08/12 Javascript
JavaScript 盒模型 尺寸深入理解
2012/12/31 Javascript
form表单action提交的js部分与html部分
2014/01/07 Javascript
js通过指定下标或指定元素进行删除数组的实例
2017/01/12 Javascript
JS闭包可被利用的常见场景小结
2017/04/09 Javascript
JS扩展String.prototype.format字符串拼接的功能
2018/03/09 Javascript
koa2 从入门到精通(小结)
2019/07/23 Javascript
小程序实现锚点滑动效果
2019/09/23 Javascript
javascript 内存模型实例详解
2020/04/18 Javascript
JavaScript直接调用函数与call调用的区别实例分析
2020/05/22 Javascript
解决echarts 一条柱状图显示两个值,类似进度条的问题
2020/07/20 Javascript
[50:21]Liquid vs Winstrike 2018国际邀请赛小组赛BO2 第二场
2018/08/19 DOTA
[50:44]DOTA2-DPC中国联赛 正赛 SAG vs Dragon BO3 第二场 2月22日
2021/03/11 DOTA
Python实现的归并排序算法示例
2017/11/21 Python
关于Python作用域自学总结
2019/06/10 Python
python cumsum函数的具体使用
2019/07/29 Python
python实现大战外星人小游戏实例代码
2019/12/26 Python
解决django的template中如果无法引用MEDIA_URL问题
2020/04/07 Python
PHP经典面试题
2016/09/03 面试题
活动邀请函范文
2014/01/19 职场文书
自我鉴定标准格式
2014/03/19 职场文书
生日宴会主持词
2014/03/20 职场文书
篮球比赛拉拉队口号
2014/06/10 职场文书
师德师风的心得体会
2014/09/02 职场文书
《爱的教育》读书心得
2014/11/08 职场文书
2015年电厂工作总结范文
2015/05/13 职场文书
超强台风观后感
2015/06/09 职场文书
个人催款函范文
2015/06/23 职场文书
早上好问候语大全
2015/11/10 职场文书
自考生自我评价
2019/06/21 职场文书
浅谈react useEffect闭包的坑
2021/06/08 Javascript