9.vue2 与 vue3 的区别
DETAILS
| 特性 | vue2 | vue3 | 
|---|
| API 设计 | Options API | Composition API(推荐),但兼容 Options API | 
| 全局 API 和内置组件 | 较为分散,部分全局 API 在 Vue3 中被调整或移除 | 更加模块化,新增了如 <teleport>等内置组件 | 
| 打包体积 | 较大,Tree Shaking 支持有限 | 更小,支持 Tree Shaking,打包更轻量 | 
| TypeScript 支持 | 可用,但类型推断可能不够准确 | 更好,内置 typing 优化,提高了类型安全性和可维护性 | 
| 响应式系统 | 基于 Object.defineProperty() | 基于 Proxy,性能更优,支持属性新增/删除检测 | 
| 性能优化 | 较少编译优化 | 引入了静态提升、事件缓存等编译优化策略 | 
| 核心代码尺寸 | 较大 | 控制在 10kb gzipped 上下,更加轻量 | 
| 架构 | 单仓库结构 | Monorepo 结构,内部分层更清晰 | 
| 开发工具和生态 | 使用 Webpack 等构建工具 | 官方推荐 Vite 开发服务器,基于 ES Import,启动快,HMR 即时 | 
DETAILS
- Options API 与 Composition API
- Vue2:主要采用 Options API(选项式 API),将一个组件的逻辑(如 data、methods、computed 等)分散在不同的选项中。这种方式在小型组件中比较直观,但在大型组件中,代码的逻辑关联性可能会被分散,不利于维护和理解。
- Vue3:推出了 Composition API(组合式 API),通过 setup 函数将相关逻辑组合在一起。例如,可以将一个功能相关的响应式数据、计算属性、方法等都放在同一个 setup 函数内,使得代码的组织更加清晰,可复用性更强,尤其适合大型复杂组件的开发。
- 全局 API 和内置组件
- Vue2 和 Vue3 在全局 API 和内置组件方面也有所不同。Vue3 对一些全局 API 进行了调整,将一些全局 API 改为实例方法或者进行了更合理的模块划分。
- Vue3 还新增了一些内置组件,如<teleport>,它允许将组件的内容渲染到指定的 DOM 节点下,而不受组件层级关系的限制。这在一些需要将组件内容渲染到特定布局(如模态框需要渲染到 body 元素下)的场景中非常有用。而 Vue2 没有类似<teleport>这样专门用于解决此类问题的组件。
- 打包体积和Tree Shaking(打包会删除未引用的内容)
- Vue3:在打包方面进行了优化,支持 Tree Shaking(树摇)。Tree Shaking 是指通过静态分析去除 JavaScript 中未引用的代码。在 Vue3 中,Tree Shaking 的作用主要是帮助减少包的体积,提高应用的性能,使打包后的代码更轻量化和高效化。
- Vue2:相比之下,Vue2 在打包体积和 Tree Shaking 方面的支持没有 Vue3 那么完善。
- TypeScript 支持 - vue3 加强 TypeScript 支持,内置 typing 优化(增加静态标记),tsx 支持,不会影响不使用 ts 的用户。提高了自身可维护性
- Vue2:虽然也可以使用 TypeScript,但在类型定义和使用上存在一些不便之处。
 
- 性能优化
- Vue2 使用 Object.defineProperty()来实现数据响应式,这种方式在初始化时会递归遍历对象的所有属性,并且对于新增或删除属性无法直接响应式处理。
- Vue3 采用 Proxy 代理对象来实现响应式,Proxy 可以直接代理整个对象,能够检测到对象属性的新增、删除等操作,并且在性能上有一定提升,特别是在处理大型复杂对象时。
- 核心代码尺寸和架构
- Vue3:核心代码尺寸控制在 10kb gzipped 上下,采用了 monorepo 结构,内部分层更清晰,提高了代码的可维护性。
- Vue2:在代码结构和尺寸方面与 Vue3 有所不同,但同样提供了稳定的功能和性能。
- 开发工具和生态 Vite
- Vue3 推出了 Vite 作为官方推荐的开发服务器,它基于浏览器原生 ES Import 实现,提供了极快的冷启动和即时热模块更新(HMR)。
- Vue2 在开发工具方面可能没有如此紧密集成的官方推荐方案。