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 相关文章推荐
关于jquery性能最佳实践的讨论,与求教
Mar 30 Javascript
extjs render 用法介绍
Sep 11 Javascript
在jquery中combobox多选的不兼容问题总结
Dec 24 Javascript
JavaScript中exec函数用法实例分析
Jun 08 Javascript
jQuery倒计时代码(超简单)
Feb 27 Javascript
JS简单验证上传文件类型的方法
Apr 17 Javascript
react-redux中connect()方法详细解析
May 27 Javascript
JavaScript 获取元素在父节点中的下标(推荐)
Jun 28 Javascript
聊聊JS动画库 Velocity.js的使用
Mar 13 Javascript
vue webpack开发访问后台接口全局配置的方法
Sep 18 Javascript
Vue 实现登录界面验证码功能
Jan 03 Javascript
Vue操作Storage本地化存储
Apr 29 Vue.js
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上传图片、删除图片实现代码
2010/05/12 PHP
PHP连接MySQL的2种方法小结以及防止乱码
2014/03/11 PHP
javascript 三种编解码方式
2010/02/01 Javascript
读jQuery之二(两种扩展)
2011/06/11 Javascript
日期处理的js库(迷你版)--自建js库总结
2011/11/21 Javascript
给文字加上着重号的JS代码
2013/11/12 Javascript
jquery无限级联下拉菜单简单实例演示
2015/11/23 Javascript
JQuery的attr 与 val区别
2016/06/12 Javascript
AngularJS使用ng-options指令实现下拉框
2016/08/23 Javascript
jquery仿苹果的时间/日期选择效果
2017/03/08 Javascript
react系列从零开始_简单谈谈react
2017/07/06 Javascript
关于vue面试题汇总
2018/03/20 Javascript
5分钟学会Vue动画效果(小结)
2018/07/21 Javascript
微信小程序开发的基本流程步骤
2019/01/31 Javascript
vue实现的网易云音乐在线播放和下载功能案例
2019/02/18 Javascript
微信小程序使用wx.request请求服务器json数据并渲染到页面操作示例
2019/03/30 Javascript
vue源码nextTick使用及原理解析
2019/08/13 Javascript
javaScript中indexOf用法技巧
2019/11/26 Javascript
微信小程序用户盒子、宫格列表的实现
2020/07/01 Javascript
vue-router路由懒加载及实现的3种方式
2021/02/28 Vue.js
[49:28]VP vs Optic 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[01:34:42]NAVI vs EG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
python中的实例方法、静态方法、类方法、类变量和实例变量浅析
2014/04/26 Python
Python获取邮件地址的方法
2015/07/10 Python
python版opencv摄像头人脸实时检测方法
2018/08/03 Python
在Python 中实现图片加框和加字的方法
2019/01/26 Python
keras在构建LSTM模型时对变长序列的处理操作
2020/06/29 Python
pycharm 添加解释器的方法步骤
2020/08/31 Python
Python实现网络聊天室的示例代码(支持多人聊天与私聊)
2021/01/27 Python
python读取图片颜色值并生成excel像素画的方法实例
2021/02/19 Python
金融专业应届生求职信
2013/11/02 职场文书
个人评价范文分享
2014/01/11 职场文书
早读迟到检讨书
2014/01/24 职场文书
2015年安全生产管理工作总结
2015/05/25 职场文书
三年级作文之小小梦想
2019/12/06 职场文书
如何用Node.js编写内存效率高的应用程序
2021/04/30 Javascript