Vue3的源码里每一个warn函数的调用都会配合 _DEV_常量的检查
# 代码片段
innerHTML 创建页面
const body = document.body;
const html = `<div></div>`;
body.innerHTML = html;
document.createElement 创建页面
const body = document.body;
const div = document.createElement("div");
body.append(div);
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
虚拟Dom创建页面的过程分为两步,第一步创建js对象,这个对象可以理解成真实Dom,第二步是递归的遍历虚拟Dom树并创建真实Dom。
# 虚拟Dom(VNnode) 创建页面的性能
- 虚拟Dom(VNnode) 创建页面的性能
- 纯js运算 2. 新建js对象 3.渲染HTML字符串
- innerHTML创建页面的性能
1.Dom运算 2. 创建Dom元素 3.新建所有Dom元素
# 虚拟Dom(VNnode) 更新页面的性能
- 虚拟Dom(VNnode) 更新页面的性能
- 纯js运算 2.创建新的js对象+Diff 3.渲染HTML字符串
- innerHTML更新页面的性能
- Dom运算 2. 必要的Dom更新 3.销毁所有旧Dom 创建所有新的Dom
- 从宏观的角度只看数量上差异,如果在同一个数量,那么认为他们没有差异,所以虚拟Dom创建页面的性能和 innerHTML创建页面的性能是一样的
- 可以发现更新页面时虚拟Dom在js层面的运算要比创建页面时多了一个 diff的性能消耗,然而它毕竟也是js层面的运算(忽略不计了 谷歌大v8运行js还是非常快的),在观察Dom层面的运算,可以发现虚拟Dom在页面更新时,只更新必要的元素,而 innerHTML 的需要全量更新(也就是 销毁所有DOM元素 在创建所有新的DOm元素),这时虚拟Dom元素的优势就体现出来了。