大概流程
使用正则解析模版,生成AST(抽象语法树),优化之后生成render函数,然后生成虚拟dom,然后通过h函数生成真实dom节点,通过patch函数渲染到页面
响应式依赖Object.defineProperty和发布订阅模式实现,在模版解析的时候,把模板中变量换成数据,绑定更新函数,添加订阅者,通过get方法依赖收集,在属性变化之后,通过setter方法通知订阅了该属性的每一个观察者更新视图,生成新的虚拟dom,再调用patch函数用diff算法比较虚拟dom区别并更新差异到视图
mvvm实现依靠Object.defineProperty和发布订阅模式实现
watch和computed
Vue
Compiler
Dep
Observer
劫持数据
Watcher
更新视图
- Get() 计算 执行函数
- update() 触发run()
- run() node同步,浏览器异步,最终调用get()
- cleanDep()清除队列
依赖收集和派发更新
mvvm/响应式原理
- 数据劫持+发布订阅
- Object.definePropertty()来劫持各个属性的getter setter,在数据变动时候通知观察者,观察者作出对应的回调去更新视图
- 数据变动的时候发布消息给订阅者,触发监听回调
- Observer,Compile,Watcher
- Observer监听model
- Compile解析编译模版
- Watcher在Observer和Compile通信,达到数据变化更新视图