Vue

Vue3的VDOM内部是做了什么, 使得比vue2更快

笔记

Posted by Wason on March 2, 2022

Vue3的VDOM内部是做了什么, 使得比vue2更快

概述

关于Vue3 比 Vue2 加强的内容, 总结来说, 可分4点描述:【与VDOM较为相关的是1、2、3】

  1. 提升了渲染速度
  2. 提升了更新速度
  3. 减少了内存占用
  4. cacheHandlers 事件侦听器缓存
  5. 增加了 typescript 的支持, 增强了代码可读性和可维护性
  6. 推出了 新特性:composition API(组合式API)

详述

1. 提升了渲染速度

  • 模板编译器(SSR渲染):vue3 采用了模板编译器实现了更快的渲染速度, 模板编译器 可将传统基于字符串的模板 编译为一组可复用的JavaScript渲染函数, 从而提高渲染速度

2. 提升了更新速度

  • 静态标记:vue3 通过标记静态节点, 和对动态节点进行优化, 同时也对update和mounted 等进行钩子的分离, 也从而提高了更新的速度

3. 减少了内存占用

  • 静态提升:vue3 引入了静态提升机制, 将静态子树的生成 放到 编译阶段, 在页面更新时跳过不需要更新的内容, 从而减少内存的占用

4. cacheHandlers 事件侦听器缓存

  1. vue 2 默认情况下onClick会被视为动态绑定, 所以每次都会去追踪它的变化
  2. vue3 会认为是同一个函数, 所以没有追踪变化, 直接缓存起来复用即可

5. 增加了 typescript 的支持, 增强了代码可读性和可维护性

  • 提供了typescript的支持

6. 推出了 新特性:composition API(组合式API)

  1. setup配置
  2. ref 与 reactive
    ref和reactive的对比
    定义
    • ref :定义基本数据类型
    • reactive:定义对象或数组类型的数据

    原理

    • ref:通过Object.defineProperty()的get和set来实现响应式(数据劫持)
    • reactive:通过Proxy来实现响应式(数据劫持), 并通过Reflect操作源对象内部数据

    使用

    • ref定义的数据:操作数据需要 .value , 读取数据时模板中不需要 .value
    • reactive定义的数据:操作和读取都不需要 .value
    • 补: 一般使用 reactive 较多, 可以将基本类型的数据封装在对象里, 然后再使用reactive
  3. watch与watchEffect ( watchEffect 不同watch需要定义监听的对象, 而是类似computed 只要函数有涉及的对象数据发生变化, 便会主动调用 )
  4. provide与inject

参考文章

1. 为什么vue3.0相对于vue2.0来说性能快1.2到1.5倍?
2. 详解Vue3中对VDOM的改进
3. Vue3新特性——Composition API详解