vue2.0源码

150 阅读1分钟

vue2.0

解析:

  • 纯dom法
  • 字符join法(innerHtml解析字符串,字符串拼接解析)
  • 反引号法(ES6 ``)
  • mustache模板引擎

mustache模板引擎

//arr数组被循环,#arr和/arr报错的代码被循环
{{#arr}}
<div></div>
{{/arr}}
//渲染
var teplate1=`
<ul>
{{#arr}}
<div></div>
{{/arr}}
</ul>
`
var data={
  arr:[{},{}]
}
Mustache.render(teplate1,data)
//Mustache.render('模板字符串',循环数据)
  • mustache不光可以循环数组,还可以直接渲染对象 Mustache.render(teplate1,对象)
  • mustache内部可以数组嵌套 arr嵌套循环arr1
{{#arr}}
<div>
{{#arr1}}
<div></div>
{{/arr1}}
</div>
{{/arr}}
  • mustache内部不能计算表达式
  • mustache布尔值可以判断是否 。渲染
var data={
  arr:false
}
  • 拆分tokens AST 抽象dom树,通过拆分成tokens,以双大括号为节点拆分

diff算法

{
  sel:'div',
  data:{},
  children:[
    sel:'div',
    data:{},
    children:[]
  ]
}
  • 虚拟节点
{
  children:undefined  //子类
  data:{}  //节点属性
  elm:undefined  //元素对应的真实dom节点
  key:undefined  //唯一标识
  sel:'div'  //节点类型
  text:'我十分的'  //节点text
}
  • 模板解析
  • h函数 可以嵌套使用 解析成虚拟dom,并不是将真实dom转换为虚拟dom 模板引擎解析->h函数解析->虚拟dom 同层比较,key标注节点唯一标识
  • patch函数 diff节点 “上树”:将虚拟节点渲染到页面
  • 精细对比算法

image.png

  • snabbdom

数据响应式

  • object.defineProperty 带有隐藏属性例如:writable(是否可改变) image.png
  • defineReactive 闭包:设置object.defineProperty set的值 image.png

image.png observe:

image.png

observer:

image.png

defineReactive:

image.png

image.png

  • 对数组的响应式 vue改写了以下方法
push
pop
shift
unshift
splice
sort
reverse
//处理数组的原型链上方法
Object.setPrototypeOf(0,arrayMethods)

image.png

observer: image.png

  • 收集依赖

image.png dep:每一层虚拟dom都有独自的dep

image.png watcher

image.png

  • 抽象语法树 AST
多层嵌套对象语法树
{
tag:"div",
attrs:[{name:"class"}],
type:1,
children:[{}]
}

模板语法->AST->h函数(渲染函数)->虚拟节点->diff生成界面

  • 创建虚拟节点
document.createDocumentFragment()