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实现屏蔽默认快捷键调用自定义事件示例
Jun 18 Javascript
jQuery实现瀑布流布局
Dec 12 Javascript
JavaScript分秒倒计时器实现方法
Feb 02 Javascript
jQuery结合CSS制作漂亮的select下拉菜单
May 03 Javascript
JavaScript中利用各种循环进行遍历的方式总结
Nov 10 Javascript
文本框只能输入数字的实现方法(兼容IE火狐)
Jun 25 Javascript
jQuery过滤选择器用法示例
Sep 12 Javascript
微信小程序 选项卡的简单实例
May 24 Javascript
JavaScript命名空间模式实例详解
Jun 20 Javascript
layui 中select下拉change事件失效的解决方法
Sep 20 Javascript
使用AutoJs实现微信抢红包的代码
Dec 31 Javascript
JS中多层次排序算法的实现代码
Jan 06 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
Symfony2框架创建项目与模板设置实例详解
2016/03/17 PHP
理解php依赖注入和控制反转
2016/05/11 PHP
php生成word并下载代码实例
2019/03/15 PHP
[原创]后缀就扩展名为js的文件是什么文件
2007/12/06 Javascript
点击下载链接 弹出页面实现代码
2009/10/01 Javascript
js鼠标左右键 键盘值小结
2010/06/11 Javascript
jquery中的mouseleave和mouseout的区别 模仿下拉框效果
2012/02/07 Javascript
全面理解面向对象的 JavaScript(来自ibm)
2013/11/10 Javascript
JS数组的赋值介绍
2014/03/10 Javascript
node.js中的fs.chmodSync方法使用说明
2014/12/18 Javascript
javascript中$(function() {});写与不写有哪些区别
2015/08/10 Javascript
SpringMVC restful 注解之@RequestBody进行json与object转换
2015/12/10 Javascript
JS实现用户注册时获取短信验证码和倒计时功能
2016/10/27 Javascript
mpvue性能优化实战技巧(小结)
2019/04/17 Javascript
vue 解决路由只变化参数页面组件不更新问题
2019/11/05 Javascript
uni-app如何实现增量更新功能
2020/01/03 Javascript
es6函数之严格模式用法实例分析
2020/03/17 Javascript
Vue3新特性之在Composition API中使用CSS Modules
2020/07/13 Javascript
解决vue项目,npm run build后,报路径错的问题
2020/08/13 Javascript
js canvas实现俄罗斯方块
2020/10/11 Javascript
python的内存管理和垃圾回收机制详解
2019/05/18 Python
pytorch使用Variable实现线性回归
2019/05/21 Python
python twilio模块实现发送手机短信功能
2019/08/02 Python
基于 Django 的手机管理系统实现过程详解
2019/08/16 Python
python 3.74 运行import numpy as np 报错lib\site-packages\numpy\__init__.py
2019/10/06 Python
VScode连接远程服务器上的jupyter notebook的实现
2020/04/23 Python
MATLAB数学建模之画图汇总
2020/07/16 Python
德国游戏机商店:Konsolenkost
2019/12/08 全球购物
Oral-B荷兰:牙医最推荐的品牌
2020/02/25 全球购物
htmlentities() 和 htmlspecialchars()有什么区别
2015/07/01 面试题
毕业生自荐书
2014/02/02 职场文书
好习惯伴我成长演讲稿
2014/05/21 职场文书
大学生年度个人总结
2015/02/15 职场文书
2015年读书月活动总结
2015/03/26 职场文书
运动会1000米加油稿
2015/07/21 职场文书
Python 图片添加美颜效果
2022/04/28 Python