Vue源码
一、模板引擎 mustache
1. 模板引擎的含义
a. 将数据变为视图的最优雅的解决方案
b. 以往数据渲染方法
纯DOM法
数组的join方法
ES6中的反引号法
2. mustache的基本使用
Mustache.render(模板字符串,数据)
{{ #循环的开始数组 }} {{ .表示简单数据 }}/{{ 每个数据的属性 }} {{ /循环结束}}
{{#数据也可以是布尔值表示标签显不显示}} {{ /数据 }}
3.mustache的底层核心机理
1. 使用正则表达式实现简单的模板引擎
const data={
thing:"苹果",
mood:"很好吃"
}
const templateStr="<h1>我买了一个{{ thing }},味道{{ mood }}"
function render(templateStr,data){
return templateStr.replace(/\{\{(\w+)\}\}/g,function(a,$1){
return data[$1]
})
}
const result=render(templateStr,data)
2. 找到双大括号—类Scanner
3. 将模板字符串转化成tokens
折叠tokends,使用栈
收集器可以是结果数组,也可以是某一个token,利用引用的特性
4. 将tokens结合数据,解析为dom字符串
二、虚拟DOM和diff算法
1. snabbdom简介
虚拟DOM
用JavaScript对象描述DOM的层次结构。DOM中的一切属性都在DOM中有对应的属性
新的虚拟DOM和老虚拟DOM进行diff(精细化比较),算出应该如何最小量更新,最后反映到真正的DOM上
2. snabbdom的h函数如何工作
a. 用来产生虚拟节点
b. h函数可以嵌套
c.手写h函数
3. diff算法原理
a. 不写key,会在最后插入节点,然后挨个替换
b. 使用key,会根据key进行比较,不会挨个替换
c. key是唯一标识
d. 只有是同一个虚拟节点,才会进行精细比较,否则会暴力删除(选择器相同并且key相同)
e. 只进行同层比较,不进行跨层比较,会暴力删除
4. 手写diff算法
四种命中查找:
① 新前与旧前
②新后与旧后
③新后与旧前 (移动到旧后的后面)
④新前与旧后 (移动到旧前的前面)
命中一种就不在命中判断了,指针会移动
如果都没有命中就需要循环中寻找
循环条件是新前小于等于新后并且旧前小于等于旧后
增加:如果旧的节点先循环完毕,说明新节点中有要插入的节点
删除:如果新节点循环完毕,老节点还有剩余节点,说明他们是要删除的节点