vue3 更新

130 阅读3分钟

1. Vue 3.0 性能提升主要是通过哪几方面体现的?

  1. diff 算法优化 新旧节点对比不在是全部重根节点开始,而是重上一次静态节点开始对比,直接复用静态节点
  2. 事件监听缓存
  3. SSR 优化 当静态内容大到一定量级时候,会用 createStaticVNode 方法在客户端去生成一个 static node,这些静态 node,会被直接 innerHtml,就不需要创建对象,然后根据对象渲染
  4. 源码体积 V3 移除了不常用的 API Tree shaking
  5. 重写数据响应拦截 V2 中用 Object.defineProperty 来劫持对象,监听所有属性,需要深度遍历所有属性,并给每个属性加上 setter 和 getter; V3 中采用了 Proxy 可以监听整个对象,不需要深度遍历
  • 可以监听属性的添加
  • 数组的索引及长度
  • 属性的删除
  1. 用 ts 重写 支持 ts

2. Vue 3.0 所采用的 Composition Api 与 Vue 2.x 使用的 Options Api 有什么区别?

  • 逻辑组织 Options API ,即以 vue 为后缀的文件,通过定义 methods,computed,watch,data 等属性与方法,共同处理页面逻辑 当组件变得复杂,导致对应属性的列表也会增长,这可能会导致组件难以阅读和理解 而 Compositon API 正是解决上述问题,将某个逻辑关注点相关的代码全都放在一个函数里,这样当需要修改一个功能时,就不再需要在文件中跳来跳去
  • 逻辑复用 在 Vue2 中,我们是用过 mixin 去复用相同的逻辑 使用单个 mixin 似乎问题不大,但是当我们一个组件混入大量不同的 mixins 的时候 会存在两个非常明显的问题:
    • 命名冲突
    • 数据来源不清晰

3. Proxy 相对于 Object.defineProperty 有哪些优点?

V2 中用 Object.defineProperty 来劫持对象,监听所有属性,需要深度遍历所有属性,并给每个属性加上 setter 和 getter;
V3 中采用了 Proxy 可以监听整个对象,不需要深度遍历
  • 可以监听属性的添加
  • 数组的索引及长度
  • 属性的删除

4. Vue 3.0 在编译方面有哪些优化?

  1. diff 算法优化 新旧节点对比不在是全部重根节点开始,而是重上一次静态节点开始对比,直接复用静态节点
  2. 事件监听缓存
  3. SSR 优化 当静态内容大到一定量级时候,会用 createStaticVNode 方法在客户端去生成一个 static node,这些静态 node,会被直接 innerHtml,就不需要创建对象,然后根据对象渲染

5. Vue.js 3.0 响应式系统的实现原理?

Vue3 使用 Proxy 对象重写响应式系统,这个系统主要有以下几个函数来组合完成的: 1、reactive: 接收一个参数,判断这参数是否是对象。不是对象则直接返回这个参数,不做响应式处理 创建拦截器对象 handler, 设置 get/set/deleteProperty get 收集依赖(track) 返回当前 key 的值。 如果当前 key 的值是对象,则为当前 key 的对象创建拦截器 handler, 设置 get/set/deleteProperty 如果当前的 key 的值不是对象,则返回当前 key 的值 set 设置的新值和老值不相等时,更新为新值,并触发更新(trigger) deleteProperty 当前对象有这个 key 的时候,删除这个 key 并触发更新(trigger) 返回 Proxy 对象 2、effect: 接收一个函数作为参数。作用是:访问响应式对象属性时去收集依赖 3、track: 接收两个参数:target 和 key 如果没有 activeEffect,则说明没有创建 effect 依赖 如果有 activeEffect,则去判断 WeakMap 集合中是否有 target 属性, WeakMap 集合中没有 target 属性,则 set(target, (depsMap = new Map())) WeakMap 集合中有 target 属性,则判断 target 属性的 map 值的 depsMap 中是否有 key 属性 depsMap 中没有 key 属性,则 set(key, (dep = new Set()))