1. 核心架构改进
1.1 组合式API (Composition API)
-
设计理念:从选项式API(Options API)转变为基于函数的组合式API
-
优势 :
- 更好的逻辑复用和代码组织
- TypeScript类型推断更友好
- 减少模板中的this依赖
- 更灵活的代码结构,适合复杂组件
-
使用方式 :
javascript// Vue2 Options API export default { data() { return { count: 0 } }, methods: { increment() { this.count++ } } } // Vue3 Composition API import { ref } from 'vue' export default { setup() { const count = ref(0) const increment = () => { count.value++ } return { count, increment } } }
1.2 TypeScript支持
- 完全使用TypeScript重写
- 更好的类型推断和IDE支持
- 内置类型定义,无需额外安装
- 泛型组件支持
1.3 模块化架构
- 核心功能拆分为独立的包:
@vue/reactivity: 响应式系统@vue/runtime-core: 核心运行时@vue/runtime-dom: DOM平台特定实现@vue/compiler-sfc: 单文件组件编译器
- 按需引入,减小打包体积
2. 响应式系统优化
2.1 从Object.defineProperty到Proxy
- Vue2限制 :
- 无法检测对象属性的添加或删除
- 无法检测数组索引和长度的变化
- 必须遍历对象的所有属性进行响应式转换
- Vue3改进 :
- 基于Proxy实现,原生支持对象属性增删
- 支持数组索引和长度变化的监听
- 自动处理Map、Set等复杂数据类型
- 懒响应式转换,提高初始化性能
2.2 响应式API增强
- 新增多个响应式API:
reactive: 创建响应式对象ref: 创建响应式引用computed: 创建计算属性watchEffect: 自动追踪依赖的副作用watch: 精确监听特定值的变化
- 提供细粒度控制:
shallowReactive/shallowRef: 浅响应式readonly/shallowReadonly: 只读代理toRaw: 获取原始对象
3. 性能优化
3.1 编译时优化
- 静态提升:将静态节点和属性提升到渲染函数外部
- PatchFlag:精确标记变化的内容,避免全量对比
- 缓存事件处理函数:避免每次渲染都创建新函数
- 预字符串化:将静态节点序列编译为HTML字符串
3.2 运行时优化
- 虚拟DOM优化 :
- 更小的虚拟DOM树
- 静态标记跳过diff
- 最长递增子序列算法优化列表更新
- 内存优化 :
- 使用WeakMap/WeakSet避免内存泄漏
- 组件卸载时更彻底的清理
- 体积优化 :
- 模块化设计,Tree-shaking友好
- 核心库体积减少约41%
4. 开发体验提升
4.1 模板语法增强
- 多根节点组件(Fragments)
- 模板中的动态指令参数
- 内置的Teleport组件用于跨组件渲染
- Suspense组件用于异步组件加载状态管理
4.2 更好的错误处理
- 更友好的错误提示
- 全局错误处理API
- 组件生命周期钩子错误捕获
4.3 开发者工具
- 更好的响应式数据可视化
- 性能分析工具
- 组件结构和依赖关系展示
5. 其他重要改进
5.1 异步组件改进
- 更简单的异步组件API
- 原生支持Suspense
- 更好的TypeScript支持
5.2 自定义渲染器API
- 更灵活的自定义渲染器创建方式
- 便于跨平台开发
- 简化了渲染器的实现难度
5.3 插件系统
- 更标准化的插件安装方式
- 支持向应用实例添加全局属性和方法
6. 代码对比示例
6.1 组件创建对比
javascript
// Vue2
new Vue({
el: '#app',
data: {
message: 'Hello'
},
methods: {
updateMessage() {
this.message = 'Updated'
}
}
})
// Vue3
import { createApp } from 'vue'
const app = createApp({
data() {
return { message: 'Hello' }
},
methods: {
updateMessage() {
this.message = 'Updated'
}
}
})
app.mount('#app')
6.2 生命周期对比
javascript
// Vue2
export default {
beforeCreate() { /* ... */ },
created() { /* ... */ },
beforeMount() { /* ... */ },
mounted() { /* ... */ },
beforeUpdate() { /* ... */ },
updated() { /* ... */ },
beforeDestroy() { /* ... */ },
destroyed() { /* ... */ }
}
// Vue3
import { onBeforeMount, onMounted, onBeforeUpdate, onUpdated, onBeforeUnmount, onUnmounted } from 'vue'
export default {
setup() {
onBeforeMount(() => { /* ... */ })
onMounted(() => { /* ... */ })
onBeforeUpdate(() => { /* ... */ })
onUpdated(() => { /* ... */ })
onBeforeUnmount(() => { /* ... */ })
onUnmounted(() => { /* ... */ })
return {}
}
}