虚拟DOM是真实DOM的轻量级JavaScript对象表示Vue3对虚拟DOM进行了重大重构优化性能并减少内存占用核心是一个树状结构每个节点对应真实DOM中的元素或组件基础VNode包含类型属性子节点等关键属性Vue3对静态节点进行特殊处理通过提升优化避免重复创建组件节点有特殊处理逻辑支持片段节点允许返回多个根节点引入patchFlag标记动态内容优化diff过程重构插槽系统表示为特殊VNode类型进行静态提升与缓存减少重复创建动态子节点生成block树结构减少diff范围内置组件有特殊处理支持异步组件组合式API影响内部结构但VNode表示基本不变编译器生成优化代码服务端渲染有特殊处理支持自定义渲染器类型系统更加精确
Vue3响应式系统相比Vue2进行了重大改进核心采用Proxy替代ObjectdefineProperty实现数据劫持Proxy能够检测新增属性和数组变化返回新对象而不修改原始对象Vue2需要通过Vueset处理新增属性且需要重写数组方法Vue3提供了refreactive等组合式API支持更灵活的响应式数据声明性能方面Vue3实现惰性响应和缓存处理优化了依赖收集机制采用effect系统替代Dep类同时扩展了对MapSet等集合类型的支持增强了调试能力并与TypeScript有更好的集成Vue3还提供了更多响应式工具函数如toRefsmarkRaw等整体上Vue3响应式系统在功能性能和开发体验上都有显著提升
Vue3的响应式系统基于Proxy实现相比Vue2有更强能力但仍需处理特殊场景原始值通过ref包装数组操作需注意length设置和稀疏数组属性删除在普通对象和MapSet中表现不同NaN比较被特殊处理循环引用可正确识别不可配置属性修改会静默失败原型链属性默认不响应异步更新会合并修改可通过flushSync强制同步__v_skip标记可跳过响应式大型数组可用readonly优化性能还可通过customRef实现自定义响应逻辑这些边界情况需要开发者特别注意以确保响应式系统正常工作
Vue3的响应式系统基于Proxy实现依赖收集和触发更新自动化但在某些场景需要手动控制停止响应的基本原理是清除依赖关系通过effect返回值的stop方法可以停止副作用组件级别可使用stop函数停止整个响应式对于嵌套对象需要递归停止响应式系统内部通过ReactiveEffect类实现停止操作性能优化时可临时停止非可见区域的响应toRefs转换后的ref需要单独停止已停止的响应式对象可重新创建effect恢复源码暴露了多种停止API处理边缘案例时需注意重复停止和内存管理服务端渲染时需要特殊处理响应式停止
Vue3的响应式系统基于Proxy实现相比Vue2的ObjectdefineProperty有显著改进核心机制通过track和trigger函数建立依赖收集和触发更新的关系对嵌套对象采用懒处理策略只在访问时才转换优化了原始值处理采用ref包装实现响应式依赖收集方面采用懒追踪策略只在effect首次运行时收集实际使用的依赖并通过effectStack缓存避免重复收集更新机制通过异步队列实现批量更新减少DOM操作支持自定义调度器控制更新时机编译时优化包括PatchFlag标记和静态提升减少运行时开销提供shallowReactive和markRaw等API实现细粒度控制内存管理使用WeakMap避免泄漏并缓存Proxy对象开发模式下支持响应式追踪和性能监测便于调试优化
Vue3中的watch和watchEffect都是响应式数据监听API但存在显著差异 watch需要显式指定监听数据源和回调函数 watchEffect自动追踪内部响应式依赖 watch的依赖收集在初始化阶段完成 watchEffect在执行时动态建立依赖 watch默认懒执行依赖变化才触发 watchEffect会立即执行一次两者都支持调度控制 源码中它们都通过doWatch实现但参数处理不同 两者都返回停止函数 watchEffect更适合自动清理副作用场景 watch适合精确监听特定数据 watch支持深度监听 watchEffect自动深度追踪 都支持调试钩子 watchEffect调试更复杂 与组件生命周期关联卸载时自动停止 watch会进行值比较 watchEffect无条件重新执行 watchEffect可能影响渲染可通过flush控制 在TypeScript中watch类型推断更精确 watchEffect依赖上下文推断
Vue3的computed是响应式系统的核心部分基于依赖的响应式数据自动计算并缓存结果当依赖项变化时重新计算否则返回缓存值提升性能实现原理围绕ComputedRefImpl类展开包含getter函数依赖收集和缓存机制通过trackRefValue和triggerRefValue管理依赖关系利用_dirty标志位控制缓存逻辑支持设置setter实现可写计算属性常与watch配合使用但两者有本质区别计算属性适用于复杂数据转换过滤排序列表表单验证状态等场景相比Vue2有显著改进如基于Proxy的响应式系统更细粒度的依赖追踪源码主要分布在reactivity模块开发时可使用onTrack和onTrigger钩子调试需要处理循环依赖同步修改依赖项等边界情况与React的useMemo相比自动依赖追踪更深集成度响应式系统原生支持缓存策略更智能
Vue3的响应式系统通过Proxy处理数组相比Vue2有显著改进它重写了七个数组变异方法优化性能确保单次调用触发一次更新直接索引修改能触发响应但超长索引需要显式设置length属性length变化会触发依赖清理多维数组递归转换保持响应性watch观察数组时需注意引用与内容差异性能方面实现批处理惰性响应和缓存策略与Vue2相比不再需要set方法能检测length变化处理稀疏数组更合理模板中自动展开ref数组编译器优化数组操作响应性内部通过track和trigger管理依赖确保搜索类方法正确收集依赖
Vue3的响应式系统基于Proxy实现会对嵌套对象进行深度代理采用懒代理策略首次访问属性时才转换为响应式对象通过get拦截器递归处理嵌套对象数组有特殊优化确保元素修改触发响应使用WeakMap缓存代理避免重复转换提供浅层响应式和markRaw优化性能相比Vue2的递归转换更高效适合处理复杂嵌套数据结构自动处理循环引用和Symbol属性与Ref配合时自动解包核心逻辑在reactiveTs和baseHandlersTs等文件中实现
Vue3的响应式系统基于Proxy实现相比Vue2的ObjectdefineProperty有显著改进reactive函数创建响应式代理时会检查是否已代理并设置标识属性基础代理处理器baseHandlers包含get和set等拦截器get负责依赖收集和递归代理set负责触发更新track函数建立effect与属性的关联trigger函数执行相关effect数组和原始值需要特殊处理性能优化包括代理缓存和浅响应式不可代理对象和循环引用也有相应处理机制