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 鼠标移动显示图片的简单实例
Dec 25 Javascript
JavaScript onkeydown事件入门实例(键盘某个按键被按下)
Oct 17 Javascript
javascript面向对象之访问对象属性的两种方式分析
Jan 13 Javascript
jquery插件NProgress.js制作网页加载进度条
Jun 05 Javascript
JavaScript中的slice()方法使用详解
Jun 06 Javascript
JS实现可关闭的对联广告效果代码
Sep 14 Javascript
详解JavaScript异步编程中jQuery的promise对象的作用
May 03 Javascript
Jquery对新插入的节点 绑定Click事件失效的解决方法
Jun 02 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(二)
May 11 Javascript
实例分析vue循环列表动态数据的处理方法
Sep 28 Javascript
JS数组Object.keys()方法的使用示例
Jun 05 Javascript
使用vuex较为优雅的实现一个购物车功能的示例代码
Dec 09 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 mkdir()无写权限的问题解决方法
2014/06/19 PHP
如何使用微信公众平台开发模式实现多客服
2016/01/06 PHP
php文档工具PHP Documentor安装与使用方法
2016/01/25 PHP
javascript中方便增删改cookie的一个类
2012/10/11 Javascript
node.js读取文件到字符串的方法
2015/06/29 Javascript
js实现当前输入框高亮显示的方法
2015/08/19 Javascript
JavaScript实现获取某个元素相邻兄弟节点的prev与next方法
2016/01/25 Javascript
JS检测移动端横竖屏的代码
2016/05/30 Javascript
终于实现了!精彩的jquery弹幕效果
2016/07/18 Javascript
基于webpack 实用配置方法总结
2017/09/28 Javascript
浅析Vue自定义组件的v-model
2017/11/26 Javascript
原生javascript AJAX 三级联动的实现代码
2018/05/04 Javascript
实例详解BootStrap的动态模态框及静态模态框
2018/08/13 Javascript
详解ES6 Promise对象then方法链式调用
2018/10/20 Javascript
vue项目动态设置页面title及是否缓存页面的问题
2018/11/08 Javascript
vue实现微信二次分享以及自定义分享的示例
2019/03/20 Javascript
Vue实现图片轮播组件思路及实例解析
2020/05/11 Javascript
Python简单连接MongoDB数据库的方法
2016/03/15 Python
python爬虫_自动获取seebug的poc实例
2017/08/05 Python
Python引用传值概念与用法实例小结
2017/10/07 Python
python实现C4.5决策树算法
2018/08/29 Python
python 获取图片分辨率的方法
2019/01/08 Python
python requests抓取one推送文字和图片代码实例
2019/11/04 Python
Python程序暂停的正常处理方法
2019/11/07 Python
python3实现从kafka获取数据,并解析为json格式,写入到mysql中
2019/12/23 Python
Pycharm生成可执行文件.exe的实现方法
2020/06/02 Python
python爬取代理IP并进行有效的IP测试实现
2020/10/09 Python
马来西亚网上购物:Youbeli
2018/03/30 全球购物
do you have any Best Practice for testing
2016/06/04 面试题
婚礼主持词
2014/03/13 职场文书
纪念九一八事变演讲稿:勿忘国耻
2014/09/14 职场文书
建筑横幅标语
2014/10/09 职场文书
离职员工给领导和同事的感谢信
2015/11/03 职场文书
自定义函数实现单词排序并运用于PostgreSQL(实现代码)
2021/04/22 PostgreSQL
Angular性能优化之第三方组件和懒加载技术
2021/05/10 Javascript
Win10 和 Win11可以共存吗? win10/11产品生命周期/服务更新介绍
2021/11/21 数码科技