一、虚拟dom

众所周知,直接使用真实dom对性能的耗费是非常巨大的,因为它会造成浏览器频繁的重绘,浏览器中渲染一个页面所需要的标准实在是太多了,如果每次都生成dom,对浏览器性能是巨大的浪费。

virtual dom就是解决这个问题的一个思路,到底什么是virtual dom呢?通俗易懂的来说就是用一个简单的对象去代替复杂的dom对象。

示例如下:

1
2
3
4
5

var mydiv = document.createElement('div');
mydiv.className = 'a';
document.body.appendChild(mydiv);

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17

//伪代码
var mydivVirtual = { 
  tagName: 'DIV',
  className: 'a'
};
var newmydivVirtual = {
   tagName: 'DIV',
   className: 'b'
}
if(mydivVirtual.tagName !== newmydivVirtual.tagName || mydivVirtual.className  !== newmydivVirtual.className){
   change(mydiv)
}

// 会执行相应的修改 mydiv.className = 'b';
//最后  <div class='b'></div>

有些网站会选择采用手工优化的方式,确实在一定构建环境中手工优化效率高于 virtual Dom ,virtual dom很多时候都不是最优的操作,但它具有普适性,在效率、可维护性之间达平衡。

diff算法

diff算法是一些前端框架常用的一种算法。它的作用是

在交叉对比的时候,当新节点跟旧节点==头尾交叉对比==没有结果的时候,会根据旧节点的key去对比旧节点数组中的key,从而找到相应旧节点(这里对应的是一个key=>index的map映射)。如果没找到就认为是一个新增节点。而如果没找到就认为是一个新增节点。而如果没有key,那么就会采用一种遍历查找的方式去找到对应的旧节点两种实现方式,一种是map映射,另一种是遍历查找。相比而言。map映射速度更快。

diff 比较规则

同级比较,不会越级比较。