[Vue源码系列-8]vue3的源码优化策略

264 阅读2分钟

vue3在线编译器

vue3编译器

一. 编译过程

  • 先将模板进行分析,生成对应的AST树(用来描述语法的对象)
  • 转化流程transform:对动态节点做一些标记(指令、插槽、事件、属性等)-- patchFlag
  • 生成代码codegen:生成最终代码

二. Block Tree

2.1 Block的概念

diff算法的特点就是递归,每次比较同一层,进行全量比对

  • block的作用就是为了收集动态节点(收集自己下面的所有的)
  • 将树的递归拍平成一个数组了
  • createVNode的时候,会判断这个节点是动态的,就让外层的block收集起来
  • 目的是为了diff的时候只diff动态节点

如果会影响结构的,都会标记成block

  • v-ifv-else
  • 父亲也会收集儿子block ,多个节点组成block tree
  • 改变结构也要封装到block中,我们期望的更新是拿以前的和现在的去比,靶向更新,如果前后节点个数不一致,那只能全部比较

三. patchFlag对不同节点进行描述

标识要比对那些类型,原理是利用JS的位运算

四. 其他优化

4.1 静态提升

  • 每次渲染,都要创建虚拟节点,createVNode
  • 静态提升,静态节点进行提取

4.2 事件缓存

  • 缓存事件,防止重新创建事件

4.3 jsx & template

jsx是为了灵活(没有优化),template是为了简单(模板编译优化)

五. Vue3Vue2的对比

  • monorepo代码管理方式
  • 响应式原理defineProperty -> proxy
  • API:options Api -> composition Api ,支持treeShaking
  • Vue3 diff算法根据 patchFlag 进行diff,Vue2进行全量diff
  • Vue3中采用最长递增子序列
  • Fragment 对多个根节点进行支持,TeleportSuspenseKeep-alivetransition
  • Vue3采用TypeScript、Vue2采用Flow
  • 自定义渲染器createRenderer(),传入自己的渲染方法,好处是可以根据vue的核心来实现不同平台的代码
  • 模板编译优化

更多vue源码系列