Vue3对比Vue2

290 阅读3分钟

1. Vue3 动机 和 新特性

动机与目的:

  1. 更好的逻辑复用 与 代码组织 (composition组合式api)

    optionsAPI(旧) => compositionAPI(新), 效果: 代码组织更方便了, 逻辑复用更方便了 非常利于维护!!

  2. 更好的类型推导 (typescript支持)

    vue3 源码用 ts 重写了, vue3 对 ts 的支持更友好了 (ts 可以让代码更加稳定, 类型检测! )

vue3新特性:

  1. 数据响应式原理重新实现 (ES6 proxy 替代了 ES5 的 Object.defineProperty)

    解决了: 例如数组的更新检测等bug, 大大优化了响应式监听的性能

    (原来检测对象属性的变化, 需要一个个对属性递归监听) proxy 可以直接对整个对象劫持

  1. 虚拟DOM - 新算法 (更快 更小)    

vue2 双端算法, 先比较开头结尾)       vue3编译器优化patchFlags, 标记更新(判断是文本更新还是属性更新, 样式更新)

  1. 提供了composition api, 可以更好的逻辑复用

  2. 模板可以有多个根元素, 因为引入了fragment概念, 如果发现组件是多根的, 就会创建一个fragment节点, 把多个根节点作为它的children, 将来patch的时候, 如果发现他是一个fragment节点, 则直接遍历children 创建或更新   为什么只能有一个根节点? 因为VDOM是一个单根树形结构,  patch方法在遍历的时候, 会从根节点开始遍历, 他要求只有一个根节点,  组件也会转换为VDOM, 

  3. 源码用 typescript 重写, 有更好的类型推导 (类型检测更为严格, 更稳定)

  4. Teleport 传送门, 将其插槽内容渲染到 DOM 结构外层中的另一个位置。 传送组件到to的位置

  5. Suspense 用于协调对组件树中嵌套的异步依赖的处理。

    接受两个插槽:#default 和 #fallback。它将在内存中渲染默认插槽的同时展示后备插槽内容。

     如果在渲染时遇到异步依赖项 (异步组件和具有 async setup() 的组件),它将等到所有异步依赖项解析完成时再显示默认插槽。

    等待异步组件时渲染一些额外的内容 , 让应用有更好的用户体验

2. Vite 的使用

webpack => 实时打包(服务器) => 浏览器运行

vite => 直接编译输出 => 将一部分模块化依赖加载解析的功能 交给了浏览器

Vite 是否需要先打包才能提供服务?

  • 开发阶段: vite不需要像webpack一样先对代码打包完成, 再启动服务器,

  • 上线阶段: webpack基于node.js的打包工具, vite借助esbuild打包的能力, 基于go语言开发, 打包速度更快

  • 使用webpack能否创建vue3的项目? webpack也能构建 vue3

3. vue-router4

vue-router4的语法和3的版本语法基本一致,但是有一些细微的修改。由于组件中无法访问this,因为无法访问this.​router和this.route

4. Pinia

Pinia 的 API 设计非常接近 Vuex 5 的提案

(1. pinia中没有mutations , 2.   没有命名空间模块,  3. 使用插件扩展 Pinia 功能: pinia plugin persistedState永久存储)

就像setup 中的props 一样,我们不能对其进行解构:为了从 Store 中提取属性同时保持其响应式,您需要使用storeToRefs()

const { status, countdown } = defineProps<{
  status?: OrderStatus  countdown?: number
}>()

开启解构Props响应式转换功能,vite.config.ts

vue({  
reactivityTransform: true
}),

在插件中调用 $subscribe

pinia.use(({ store }) => {
  store.$subscribe(() => {
    // 在存储变化的时候执行
  })
  store.$onAction(() => {
    // 在 action 的时候执行
  })
})

TypeScript

Typing 插件