Vue.js 的渲染系统负责高效地将组件模板和响应式状态转换为 DOM 操作。它处于 Vue 响应式模型的核心,决定着应用程序状态的变化如何以及何时反映在 UI 中。本文档重点介绍核心渲染系统的架构和工作流程。
有关渲染系统特定方面的更多详细信息,请参阅有关 虚拟 DOM、服务端渲染 和 过渡 的页面。
Vue.js 渲染系统采用基于虚拟 DOM 的方法,通过模块化架构实现,将核心渲染逻辑与平台特定的 DOM 操作分离。
来源
渲染系统被设计为与平台无关,核心逻辑在 runtime-core 中定义,并通过一组选项提供平台特定的实现。主要组件包括:
渲染器工厂:createRenderer 函数创建为特定平台(浏览器 DOM、服务器端渲染等)配置的渲染器实例。
VNode 处理器:patch 函数根据 VNode 的类型递归处理虚拟 DOM 节点。
元素处理器:processElement、processComponent 等函数处理不同的 VNode 类型。
DOM 操作:用于挂载(mountElement、mountComponent)和更新(patchElement、updateComponent) DOM 元素的函数。
响应式集成:setupRenderEffect 创建将状态更改连接到渲染器更新的响应式效果。
渲染过程涉及从组件创建到 DOM 更新的流程,响应式集成实现了自动 UI 更新。
来源
渲染过程遵循以下步骤:
组件创建:当组件首次创建时,createComponentInstance 会初始化一个新组件实例。
组件设置:setupComponent 处理 props、slots 并执行 setup 函数以建立响应式状态。
渲染效果设置:setupRenderEffect 创建一个响应式效果,该效果会:
patch 函数处理此树以更新 DOM初始渲染:初始渲染会创建完整的 DOM 结构。
更新周期:当响应式状态更改时,渲染效果会被触发,生成一个新的 VNode 树,并高效地与前一个 VNode 树进行 patch。
组件在渲染过程中会经历特定的生命周期阶段,并在关键节点提供钩子。
来源
组件渲染生命周期包括:
创建阶段:
createComponentInstance 创建组件实例setupComponent 设置组件(props、slots、state)setupRenderEffect 创建渲染效果挂载阶段:
beforeMount 生命周期钩子renderComponentRoot 执行渲染函数patch 处理 VNode 树mounted 生命周期钩子更新阶段:
beforeUpdate 生命周期钩子updated 生命周期钩子卸载阶段:
beforeUnmount 生命周期钩子unmounted 生命周期钩子patch 函数是 Vue diff 和更新机制的核心,它决定了如何高效地更新 DOM。
来源
Patching 过程的逻辑因节点类型而异
Patch 入口点:调用 patch 函数,传入前一个 VNode(n1)、新 VNode(n2)和容器。
类型检查:
元素 Patching:
mountElement 创建新的 DOM 元素。patchElement 更新现有的 DOM 元素,处理:组件 Patching:
mountComponent 创建并设置组件。updateComponent 确定组件是否需要更新并触发重新渲染。优化:该过程使用多种优化技术。
Vue 的渲染系统设计为平台无关,通过渲染器选项提供平台特定的详细信息。
来源
渲染器创建的关键方面
渲染器工厂:createRenderer 函数接受平台特定的实现细节:
基础渲染器创建:baseCreateRenderer 函数:
patch、render 等)render:用于挂载到容器createApp:用于创建应用程序实例的工厂平台适配 (Platform Adaptation):
runtime-dom 提供server-renderer 提供渲染器 API:生成的渲染器公开:
render:将 VNode 渲染到容器的函数createApp:用于创建绑定到此渲染器的应用程序实例的工厂组件通过特定的接口和生命周期与渲染系统集成。
来源
组件-渲染器集成包括:
组件实例创建:createComponentInstance 初始化新组件,包含:
组件设置:setupComponent 准备组件:
渲染效果设置:setupRenderEffect 创建响应式效果:
instance.update渲染过程:
更新:
Vue 的渲染系统包含多种优化技术以提高性能。
来源
Vue 渲染系统中的关键优化技术
PatchFlags:指示节点哪些部分需要更新的数字标志。
CLASS (1):仅 class 需要更新。STYLE (2):仅 style 需要更新。PROPS (4):仅部分 props 需要更新。TEXT (8):仅 text content 需要更新。FULL_PROPS (32):所有 props 都可能需要更新。Block Tree:跟踪动态节点的结构。
openBlock():开始跟踪动态节点。createBlock():创建一个 block 根节点,该节点跟踪动态子节点。Dynamic Children:允许直接 patch 动态节点。
vnode.dynamicChildren 中跟踪动态子节点。patchBlockChildren() 直接 patch 动态节点,无需遍历稳定节点。静态提升:在编译期间:
这些优化通过以下方式显著提高了渲染性能:
Vue 的渲染系统是一个复杂的管道,它将组件模板和响应式状态转换为高效的 DOM 操作。虚拟 DOM 抽象、响应式系统和各种优化技术的结合,使得 Vue 既能提供开发者友好的抽象,又能实现高性能的 UI 更新。
核心架构将渲染逻辑(在 runtime-core 中实现)与平台特定操作(由 runtime-dom 和其他实现提供)分离,使系统具有灵活性和可扩展性。这种清晰的分离也支持服务器端渲染和自定义渲染器等高级功能。
Patching 算法智能地确定所需的最小 DOM 操作集,而像 patch flags 和 block tree 这样的优化技术通过跳过不必要的工作进一步提高了性能。这些元素共同构成了一个统一的系统,能够处理 UI 渲染的复杂性,同时保持出色的性能。
来源