说一下vue是如何实现数据响应的(MVVM的实现)
- vue使用observer来劫持每个对象的属性,其原理,vue2使用的是
Object.defineProptory,而vue3使用的是Proxy - 使用Dep通过dep.depend()来收集依赖,在initData、initProps、以及watch、computed时候来收集render函数依赖的属性和数据(get阶段),在数据set阶段dep发现发生变化,调用dep,notify()来通知render函数渲染,以及watch回调
- 通过scheduler实现高效调用,实质就是将修改放在一个微任务里面去执行,实际上就是nextTick,所以我们在vue中一般为了确保dom更新完成会调用nextTick来实现
Proxy和Object.defineProptory的区别
template到render函数经历了哪些事情(template是怎么编译成render函数的)
一共3个阶段
- parse:
- 通过正则匹配生成AST抽象语法树
- optimize:
- 标记节点是否为静态节点,主要判断是否有v-if、v-for、bind属性等指令
- generate:
- 将AST抽象语法树进行词法和语法分析
- 生成虚拟dom树,其中包含了节点信息等
vue3对比vue2通过哪些方面来提升性能的
- 静态提升
- 区分静动态节点和属性,将静态节点和静态属性提升
- 预字符串化
- 连续大量的静态模版预字符串化,通过createStaticVnode方法
- 缓存时间处理函数
- 时间添加cache,因为时间处理不会发生变化
- Block Tree
- 主要在patch阶段,编译时候对每一个节点进行标记为动态节点还是静态节点
- 将动态节点记录在根节点,也就是block节点
- 在运行时候只对动态节点进行比较,这样就不会涉及到静态节点的比较
- PatchFlag
- 主要针对对比某一个节点
- 记录单个节点哪些是动态的,每次只比较动态的节点,例如text、class等
说说你对diff的理解(包含patch的过程)
- diff的时机
- 当组件初始化或者有数据更新的回收,会执行对应的函数,函数主要做两件事情
- 运行
_render的时候 - 运行
_update的时候
- 运行
- diff的时机就发生在update的运行过程中
- 当组件初始化或者有数据更新的回收,会执行对应的函数,函数主要做两件事情
- update函数做了哪些事情
- 先对虚拟dom赋值this._vnode(老的dom) = vnode(传入的新的dom)
- 更新真实dom的的过程叫diff,算法就是patch算法
- patch算法的过程
- 如果旧树没有节点(也就是第一次的时候),直接用新的vnode形成一个树来渲染真实dom,挂载到节点
- 如果旧树存在,patch主要做两件事,1. 完成所有真实dom的最小化处理 ;2. 将新树的对应到合适的真实dom
- 先判断根节点是否为相同(tag类型相同、key相同)的节点,如果不相同直接创建新的节点,旧的节点直接remeve掉
- 如果相同的情况,更新根节点的其他属性,有变化的更新到真实的dom中
- 然后对比子节点,新旧的数组头尾双指针遍历,两个比较如果没有相同
- 如何比较新旧数组的过程(双指针向中间遍历的过程)
- 先比较两个头指针,如果相同替换,如不相同
- 比较两个尾指针,相同移动真实的dom尾部元素,如不相同
- 比较头尾,尾头,有相同移动元素替换,没有移动指针序号
key的好处
没有key比较元素相同,会大量反复的修改子元素,存在大量dom重排重绘
例如:如果头部插入,没有key值,进行逐个元素修改,如果有key只是添加一个元素,后面的通过移动就可以完成
对nextTick的理解
nextTick可以传入一个回调函数,该回调回调函数会被放入到vue运行时的微队列的中去,等到dom执行完成之后调用nextTick,nextTick实现优先使用MutationObserver,如果不支持MutationObserver则使用setImmediate(主要在IE10支持),如果不支持,则使用setTimeout
vue和react的区别的理解
- vue是数据双向绑定,react是数据单向流
- vue是渐进式的,react是侵入式的推荐使用jsx编写
- vue不会重新渲染整棵树,react如果不加干预会重新刷新整个组件
vuex和pinia的区别、优缺点
- vuex优点:
- 生态更成熟,使用过的业务场景更丰富
- 上手成本低
- pinia优点:
- 体积更小
- 不再有mutation,都用actions去实现
- 支持多实例,不再需要modules去管理
- 更好的支持ts
- composition api维护更方便