快速了解-diff
diff的快速了解 - javascript
简介
diff算法存在很多的地方,比如linux中可以对比两文件的差异;Beyond Compare 4这个软件对比线上文件以及本地的文件差异;git 上对比文件差异等……
而前端中使用diff算法主要是为了减少DOM的操作,因为在浏览器中对DOM的操作代价以及速度比执行JavaScript性能消耗代价要大;使用diff算法可以找出新旧两个vNode的差异,进行对比更新从而只更新需要更新的节点;一切为了优化
开始
以下过程基于Vue
Vue的基本编译过程为:
Template->AST->render->vNode->新旧vNode对比>diff和patch->updaterAST与vNnode合并的对对象属性进行监听时候生成dep,形成闭包;初次mount的时候将watcher放到Dep变量中,然后调用render将AST以及data一同combine成vNode;combine的时候会调用dep里的方法将watcher push到被一开始defineProperty被监听的dep中;当data进行更新的时候会调用notify通知watcher进行update;diff发生在通知所有订阅者watcher之后,将虚拟dom渲染到页面中之前,新旧vNode进行对比,打补丁,更新对应的DOM;
以下不基于Vue
假设以下图片为旧的vDom以及新的vDom的树结构(不考虑位移,只考虑文本替删除以及替换新节点)
假设我现在有两个vDom树(与上图结构无联系,上图仅做为一个抽象的理解):
1 |
|
我需要对这两个节点进行domDiff以获得补丁
1 |
|
domDiff完得到一个补丁,结构如下
1 |
|
期中type表示更改的dom进行了什么修改,基本有如下操作
1 |
|
等……
获得补丁之后就是更新差异了,doPatch
1 |
|
更新差异,替换需要更新的节点;大致diff的流程就是这样;获取补丁,更新差异。就可以做到更新所需更新的节点
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!