菜单

高级特性

相关源文件

本文档介绍了 Vue.js 核心中超出基本响应性、组件和渲染系统的高级特性。这些特性支持更复杂的应用程序架构和集成模式。有关基本组件系统的信息,请参阅组件系统,有关响应性的详细信息,请参阅响应性系统

高级功能概述

Vue.js 提供了几项高级特性来解决现代 Web 应用程序中的特定挑战。

  1. 自定义元素集成 - 将 Vue 组件用作 Web Components
  2. 服务器端渲染 (SSR) - 在服务器上渲染 Vue 应用程序,并进行客户端 hydration
  3. Suspense - 处理异步组件的加载状态
  4. Teleport - 将内容渲染到不同的 DOM 位置
  5. 热模块替换 (HMR) - 在开发过程中更新组件,无需刷新页面

来源

  • packages/runtime-dom/src/apiCustomElement.ts
  • packages/runtime-core/src/hydration.ts
  • packages/runtime-core/src/components/Suspense.ts
  • packages/runtime-core/src/components/Teleport.ts
  • packages/runtime-core/src/hmr.ts

自定义元素 (Web Components)

Vue 提供了与 Web Components 标准强大的集成,允许 Vue 组件被用作任何 Web 应用程序中的自定义元素,即使是在 Vue 之外。

架构与实现

defineCustomElementdefineSSRCustomElement 函数将 Vue 组件定义转换为自定义元素。它们内部创建一个扩展 HTMLElement 的类,并管理 Vue 组件的生命周期。

来源

  • packages/runtime-dom/src/apiCustomElement.ts:167-196
  • packages/runtime-dom/src/apiCustomElement.ts:202-683

主要功能

  1. 属性/特性反射:Vue 的 prop 会自动映射到自定义元素的属性和特性,并进行适当的类型转换。

  2. Shadow DOM 集成:默认情况下,自定义元素使用 Shadow DOM 进行样式封装。可以通过 shadowRoot: false 选项禁用此功能。

  3. 插槽:支持原生的插槽投影,无论是否使用 Shadow DOM。

  4. 异步组件:可以从异步组件创建自定义元素,并具有适当的加载状态。

  5. SSR 支持defineSSRCustomElement 提供与声明式 Shadow DOM 的 hydration 兼容性。

使用示例

来源

  • packages/runtime-dom/tests/customElement.spec.ts:34-147
  • packages/runtime-dom/tests/customElement.spec.ts:348-359

Teleport

Teleport 是一种允许将 DOM 内容移动到 DOM 树中不同位置的功能,同时保留组件层级以进行事件处理和响应性。

实现与架构

核心实现位于 TeleportImpl 中,它负责创建、移动和卸载 teleported 内容的过程。

来源

  • packages/runtime-core/src/components/Teleport.ts:75-337
  • packages/runtime-core/tests/components/Teleport.spec.ts:264-437

主要功能

  1. 目标选择:可以通过 CSS 选择器或直接的元素引用将内容 teleport 到任何 DOM 元素。

  2. 禁用模式:Teleport 可以动态启用/禁用,在禁用时将内容放回原始位置。

  3. 延迟加载defer 属性允许在目标元素存在于 DOM 中后 teleport 内容,即使它稍后才出现在文档中。

  4. 保持上下文:保留组件上下文和响应性,允许事件通过虚拟 DOM 树冒泡。

  5. SSR 支持:Teleport 可与服务器端渲染配合使用,并提供特殊的 hydration 处理。

使用示例

来源

  • packages/runtime-core/tests/components/Teleport.spec.ts:145-193
  • packages/runtime-dom/tests/customElement.spec.ts:81-122

Suspense

Suspense 是一项实验性功能,提供了一种处理异步组件或异步 setup 函数加载状态的方法。

架构与实现

Suspense 被实现为一个特殊的内置组件,用于管理异步依赖项和渲染状态。

来源

  • packages/runtime-core/src/components/Suspense.ts:61-783
  • packages/runtime-core/tests/components/Suspense.spec.ts:70-208

主要功能

  1. 异步组件:处理异步组件或具有异步 setup 函数的组件的加载状态。

  2. 嵌套异步依赖:跟踪所有嵌套的异步组件,并在所有组件解析后才渲染最终内容。

  3. 超时:支持超时选项,以便在异步操作花费时间过长时显示备用内容。

  4. 过渡支持:与过渡系统配合使用,实现备用内容和已解析内容之间的平滑视觉变化。

  5. 事件:提供不同状态的事件 - onPendingonResolveonFallback

使用示例

来源

  • packages/runtime-core/tests/components/Suspense.spec.ts:96-158
  • packages/runtime-core/tests/components/Suspense.spec.ts:319-368

服务器端渲染 (SSR) 和 Hydration

Vue 的 SSR 系统在服务器上渲染组件,然后将渲染后的 HTML 在客户端上 "hydration",使其具有交互性。

注水过程

hydration 过程会将事件监听器和响应式状态附加到现有 DOM 上,而不是重新创建它们。

来源

  • packages/runtime-core/src/hydration.ts:91-782
  • packages/runtime-core/tests/hydration.spec.ts:64-156

主要功能

  1. 不匹配检测:识别并处理服务器渲染的 HTML 与客户端将要渲染的内容之间的差异。

  2. 组件处理:对不同组件类型进行特殊处理,包括 Fragments、Teleport 和 Suspense。

  3. 属性归一化:对属性、类名和样式进行归一化,以实现正确的匹配。

  4. 错误恢复:在生产环境中,尝试以最小的 DOM 更改来从不匹配中恢复。

  5. Web Components 支持:对带有 Shadow DOM 的自定义元素的 hydration 提供特殊支持。

来源

  • packages/runtime-core/src/hydration.ts:367-548
  • packages/runtime-core/tests/hydration.spec.ts:522-619
  • packages/vue/tests/e2e/ssr-custom-element.spec.ts:18-79

热模块替换(HMR)

热模块替换允许在开发过程中更新组件,而不会丢失状态或需要完全重新加载页面。

实现与架构

Vue 的 HMR 系统使用全局运行时 API 来跟踪和更新组件。

来源

  • packages/runtime-core/src/hmr.ts:22-39
  • packages/runtime-core/src/hmr.ts:104-174
  • packages/runtime-core/tests/hmr.spec.ts:34-158

主要功能

  1. 组件跟踪:使用唯一的 __hmrId 注册组件以进行热更新。

  2. 选择性更新:可以仅更新渲染函数或整个组件定义。

  3. 状态保留:在可能的情况下,在更新期间保留组件状态。

  4. 自定义元素集成:对 Web Components 进行特殊处理,以更新 Shadow DOM 中的样式和模板。

  5. 开发工具:暴露为一个全局 API,构建工具可以与其交互。

来源

  • packages/runtime-core/src/hmr.ts:51-64
  • packages/runtime-core/src/hmr.ts:81-102
  • packages/runtime-core/tests/hmr.spec.ts:120-155

高级功能集成

Vue 的高级功能相辅相成,协同工作以提供强大的能力。

例如

  1. 自定义元素 + SSRdefineSSRCustomElement 通过声明式 Shadow DOM 提供 hydration 支持。

  2. Teleport + SSR:Teleport 的内容被收集到缓冲区中,并在服务器渲染期间插入到正确的位置。

  3. Suspense + Teleport:Teleport 的内容可以被包裹在 Suspense 中以处理异步加载状态。

  4. 自定义元素 + HMR:特殊处理会更新 Shadow DOM 中的样式和模板。

来源

  • packages/runtime-dom/src/apiCustomElement.ts:187-194
  • packages/runtime-core/src/components/Teleport.ts:75-103
  • packages/server-renderer/src/helpers/ssrRenderTeleport.ts:9-43
  • packages/runtime-core/src/hmr.ts:137-142

结论

Vue 的高级功能为构建复杂的应用程序提供了强大的能力,同时保持了清晰的基于组件的架构。这些功能可以独立使用,也可以组合使用以满足特定的应用程序需求。

每个功能都经过精心设计,可以与 Vue 的核心渲染和响应性系统协同工作,同时还提供了与 Web 标准和外部工具的集成点。