1. 核心架构改进
1.1 组合式API (Composition API)
- 设计理念:从选项式API(Options API)转变为基于函数的组合式API
- 优势:
- 更好的逻辑复用和代码组织
- TypeScript类型推断更友好
- 减少模板中的this依赖
- 更灵活的代码结构,适合复杂组件
- 使用方式:
export default {
data() {
return { count: 0 }
},
methods: {
increment() { this.count++ }
}
}
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 组件创建对比
new Vue({
el: '#app',
data: {
message: 'Hello'
},
methods: {
updateMessage() {
this.message = 'Updated'
}
}
})
import { createApp } from 'vue'
const app = createApp({
data() {
return { message: 'Hello' }
},
methods: {
updateMessage() {
this.message = 'Updated'
}
}
})
app.mount('#app')
6.2 生命周期对比
export default {
beforeCreate() { },
created() { },
beforeMount() { },
mounted() { },
beforeUpdate() { },
updated() { },
beforeDestroy() { },
destroyed() { }
}
import { onBeforeMount, onMounted, onBeforeUpdate, onUpdated, onBeforeUnmount, onUnmounted } from 'vue'
export default {
setup() {
onBeforeMount(() => { })
onMounted(() => { })
onBeforeUpdate(() => { })
onUpdated(() => { })
onBeforeUnmount(() => { })
onUnmounted(() => { })
return {}
}
}