Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

讲一下 Vue2 和 Vue3 的区别? #15

Open
Hongbusi opened this issue Jun 17, 2022 · 1 comment
Open

讲一下 Vue2 和 Vue3 的区别? #15

Hongbusi opened this issue Jun 17, 2022 · 1 comment
Labels

Comments

@Hongbusi
Copy link
Member

No description provided.

@Hongbusi Hongbusi added today 每日一题。 Vue labels Jun 17, 2022
@RainyNight9
Copy link
Member

区别主要体现在优化点上。

Vue3 对比 Vue2 的优化点

总共大约 3 个大方面的优化:

  1. 源码优化
  2. 性能优化
  3. API优化

源码优化

目的是让代码更易于开发和维护。

  1. 更好的代码管理方式:monorepo

Vue2 源码结构:

image.png

  • compiler(模板编译的相关代码)
  • core(与平台无关的通用运行时代码)
  • platforms(平台专有代码)
  • server(服务端渲染的相关代码)
  • sfc(.vue 单文件解析相关代码)
  • shared(共享工具代码)

Vue3 源码结构:

image.png

Vue3 ,整个源码是通过 monorepo 的方式维护的,根据功能将不同的模块拆分到 packages 目录下不同的子目录中。

monorepo 把这些模块拆分到不同的 package 中,每个 package 有各自的 API、类型定义和测试。这样使得模块拆分更细化,职责划分更明确,模块之间的依赖关系也更加明确,开发人员也更容易阅读、理解和更改所有模块源码,提高代码的可维护性。

另外一些 package(比如 reactivity 响应式库)是可以独立于 Vue 使用的,这样用户如果只想使用 Vue3 的响应式能力,可以单独依赖这个响应式库而不用去依赖整个 Vue,减小了引用包的体积大小。

  1. 更超集的 JavaScript:TypeScript

TypeScript 提供了更好的类型检查,能支持复杂的类型推导;由于源码就使用 TypeScript 编写,也省去了单独维护 d.ts 文件的麻烦;就整个 TypeScript 的生态来看,TypeScript 团队也是越做越好,TypeScript 本身保持着一定频率的迭代和更新,支持的 feature 也越来越多。

性能优化

  1. 源码体积优化
  • 移除一些冷门的 feature(比如 filter、inline-template 等)
  • 引入 tree-shaking 的技术,减少打包体积

tree-shaking 依赖 ES2015 模块语法的静态结构(即 import 和 export),通过编译阶段的静态分析,找到没有引入的模块并打上标记。然后压缩阶段会利用例如 uglify-js、terser 等压缩工具真正地删除这些没有用到的代码。

  1. 数据劫持优化

Vue3 使用了 Proxy API 做数据劫持。Proxy API 并不能监听到内部深层次的对象变化,因此 Vue3 的处理方式是在 getter 中去递归响应式,这样的好处是真正访问到的内部对象才会变成响应式,而不是无脑递归,这样无疑也在很大程度上提升了性能。

  1. 编译优化

Vue3 通过编译阶段对静态模板的分析,编译生成了 Block tree。Block tree 是一个将模版基于动态节点指令切割的嵌套区块,每个区块内部的节点结构是固定的,而且每个区块只需要以一个 Array 来追踪自身包含的动态节点。借助 Block tree,Vue 将 vnode 更新性能由与模版整体大小相关提升为与动态内容的数量相关,这是一个非常大的性能突破。

Vue3 在编译阶段还包含了对 Slot 的编译优化、事件侦听函数的缓存优化,并且在运行时重写了 diff 算法。

API 优化

Composition API VS Options API

Composition API 属于 API 的增强,它并不是 Vue3 组件开发的范式,如果你的组件足够简单,你还是可以使用 Options API。

  1. 逻辑组织优化

image.png

Composition API 是将某个逻辑关注点相关的代码全都放在一个函数里,这样当需要修改一个功能时,就不再需要在文件中跳来跳去。

  1. 逻辑复用优化

编写 hook 函数:

不会出现命名冲突的问题
有更好的类型支持,因为它们都是一些函数

hook > mixins

@Hongbusi Hongbusi removed the today 每日一题。 label Jun 20, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Development

No branches or pull requests

2 participants