门面组件

门面组件是伪造的 UI 元素,一旦第三方脚本加载后会被替换。

Nuxt Scripts 提供了若干门面组件供你使用,以加速应用的性能。

使用它们有利弊,但可以帮助提升应用的性能体验。

什么是门面组件?

为了渲染诸如视频嵌入、支付弹窗或聊天插件等第三方脚本所依赖的复杂组件,我们需要加载许多资源。
在 Nuxt 启动时加载它们会降低你的应用性能。

然而,如果我们延迟加载脚本直到 Nuxt 启动完成,会导致有害的内容布局偏移(CLS)和视觉噪点,
进而造成较差的用户体验。

门面组件的目标是通过渲染一个“假”的 UI 元素来解决这个问题,这个“假”元素会在第三方脚本加载后被替换。

通过钩住合适的 DOM 事件并提供用户反馈,我们可以使用这些假元素,同时仍然保障良好的用户体验。

使用门面组件的利弊是什么?

虽然性能上的提升非常明显,但在用户体验上可能存在权衡。

  • 内容不匹配的闪烁:假 UI 元素可能与最终的 UI 元素外观不同,导致内容闪烁错位。Nuxt Scripts 只提供了最小化的样式,你可能需要调整以匹配你的应用设计。
  • 交互性可能中断:元素的交互性依赖于脚本的加载,如果脚本未加载,你需要提供降级处理。
  • 无障碍性问题:需要在脚本加载或加载失败时,向用户提供明确的无障碍(a11y)反馈。

Nuxt Scripts 门面组件

所有门面组件都是无样式组件,包装对应的 useScript<provider> 组合式函数。文档中仅提供最小化样式,作为起点。

使用门面组件的最佳实践

提供错误降级处理

如果脚本加载失败,提供一个降级方案,告知用户加载失败并提供访问内容的替代方式。

<ScriptYouTubePlayer>
  <template #error>
    <UAlert color="red" title="YouTube 播放器加载失败" description="请刷新页面重试。" />
  </template>
</ScriptYouTubePlayer>

提供可访问的加载状态反馈

脚本加载期间,提供加载状态,告知用户内容正在加载中。

ScriptLoadingIndicator 组件由 Nuxt Scripts 提供,帮助实现加载状态展示并提供无障碍反馈。

<ScriptYouTubePlayer>
  <template #loading>
    <ScriptLoadingIndicator />
  </template>
</ScriptYouTubePlayer>

明智地选择触发事件

门面组件预设了最佳的通用性能事件触发,但你可以自定义触发事件,使其更契合你的应用需求。

最佳触发事件是需要明确用户交互的事件,如点击。
鼠标悬停加载可能导致用户体验问题,比如丢失后续点击事件。

门面组件 API

所有门面组件共享相似的 API。

Props

插槽

该组件默认只提供最小化 UI,保证功能和可访问性。你可通过多个插槽按需自定义组件。

  • default - 组件始终显示的内容。
<template>
  <ScriptYouTubePlayer>
    <div class="bg-blue-500 text-white p-5">
      Youtube!
    </div>
  </ScriptYouTubePlayer>
</template>
  • loading - 仅在脚本加载中显示的内容。
<template>
  <ScriptYouTubePlayer>
    <template #loading>
      <ScriptLoadingIndicator />
    </template>
  </ScriptYouTubePlayer>
</template>
  • awaitingLoad - 脚本等待加载时显示的内容。
<template>
  <ScriptYouTubePlayer>
    <template #awaitingLoad>
      <div class="bg-blue-500 text-white p-5">
        点击播放!
      </div>
    </template>
  </ScriptYouTubePlayer>
</template>
  • error - 当脚本加载失败时显示的内容。
<template>
  <ScriptYouTubePlayer>
    <template #error>
      <UAlert color="red" title="YouTube 播放器加载失败" description="请刷新页面重试。" />
    </template>
  </ScriptYouTubePlayer>
</template>

事件

  • ready - 脚本加载完成时触发,提供底层脚本 API 的访问权限。
  • error - 脚本加载失败时触发。