Vue 3 (2020年发布) 是 Vue 2 的重大升级版本,带来了许多架构改进和新特性。以下是两者的主要区别:
1. 架构与性能
-
响应式系统重写:
- Vue 2 使用
Object.defineProperty - Vue 3 改用
Proxy,支持更多数据类型(如Map/Set)和更好的性能
- Vue 2 使用
-
虚拟DOM优化:
- Vue 3 的 diff 算法更高效
- 静态树提升(Static Tree Hoisting)和静态属性提升(Static Props Hoisting)
- 碎片支持(Fragments),组件可以有多个根节点
-
打包体积更小:
- Vue 3 核心代码体积减少约40%
- Tree-shaking 支持更好,未使用的API不会打包进最终代码
2. Composition API
- Vue 2:主要使用 Options API (data, methods, computed等选项)
- Vue 3 :引入 Composition API (
setup()函数),逻辑组织更灵活
javascript
// Vue 3 Composition API 示例
import { ref, computed } from 'vue'
export default {
setup() {
const count = ref(0)
const double = computed(() => count.value * 2)
function increment() {
count.value++
}
return { count, double, increment }
}
}
3. 类型支持
- Vue 2:对TypeScript支持有限
- Vue 3:完全用TypeScript重写,提供更好的TS支持
4. 新特性
- Teleport:将组件渲染到DOM中的任意位置
- Suspense:处理异步组件加载状态
- 多个v-model:一个组件支持多个v-model绑定
- 自定义渲染器API:更容易创建自定义渲染器(如小程序、Canvas等)
5. 生命周期变化
| Vue 2 | Vue 3 (Composition API) |
|---|---|
| beforeCreate | 使用 setup() |
| created | 使用 setup() |
| beforeMount | onBeforeMount |
| mounted | onMounted |
| beforeUpdate | onBeforeUpdate |
| updated | onUpdated |
| beforeDestroy | onBeforeUnmount |
| destroyed | onUnmounted |
6. 其他重要变化
-
全局API变更:
Vue.prototype改为app.config.globalProperties- 全局API如
Vue.nextTick()改为按需导入
-
指令变化:
v-model默认使用modelValue而非valuev-bind的.sync修饰符被移除,用v-model参数替代
-
过渡类名变更:
v-enter改为v-enter-fromv-leave改为v-leave-from
7. 兼容性
- Vue 3 不兼容 IE11 (需要额外polyfill)
- 大多数 Vue 2 插件需要更新才能在 Vue 3 中使用
迁移建议
- 新项目建议直接使用 Vue 3
- 现有 Vue 2 项目可以使用迁移构建版本
- 官方提供迁移工具
@vue/compat帮助逐步迁移
Vue 3 在性能、开发体验和扩展性方面都有显著提升,特别是对于大型复杂应用,Composition API 提供了更好的代码组织和复用方式。