spa-loading-template.html

spa-loading-template.html 文件用于定义客户端渲染页面初始化期间显示的加载界面。

Geprüfte Übersetzung ·0 % geprüft

当页面以 ssr: false 渲染时(可以在 nuxt.config 中全局设置,也可以通过 routeRules 为特定路由设置),服务器会返回一个不含服务端渲染应用内容的 HTML 框架。在 JavaScript bundle 下载完成、Nuxt 插件运行完毕且首个页面渲染完成之前,用户看不到页面内容。

你可以添加 app/spa-loading-template.html 文件来填补这段等待时间。文件内容会直接插入服务器返回的 HTML 中,因此 Nuxt 客户端 bundle 加载前就能显示。

app/spa-loading-template.html
<!-- https://github.com/barelyhuman/snips/blob/dev/pages/css-loader.md -->
<div class="loader"></div>
<style>
  .loader {
    position: fixed;
    top: 50%;
    left: 50%;
    width: 24px;
    height: 24px;
    margin: -12px 0 0 -12px;
    border: 2px solid #efefef;
    border-top-color: #000;
    border-radius: 50%;
    animation: loader 600ms linear infinite;
  }

  @keyframes loader {
    to { transform: rotate(360deg); }
  }
</style>
该文件是独立于 Vue 渲染的纯 HTML,因此不能在其中使用 Vue 组件或自动导入。请在此文件中直接写入加载界面所需的样式,不要依赖应用的样式表。
该文件只负责客户端渲染页面的首次加载。若要在页面切换时显示加载状态,请使用 <NuxtLoadingIndicator> 组件。

移除时机

默认情况下,加载模板会渲染在 Nuxt 应用根元素旁边,而不是根元素内部:

<div id="__nuxt"></div>
<div id="__nuxt-loader"><!-- spa-loading-template.html --></div>

加载模板会一直显示,直到首个页面(包括页面中的异步 setup)准备渲染,随后被移除。这可以避免加载画面与页面之间出现白屏。你可以使用 app.spaLoaderTag 和 app.spaLoaderAttrs 自定义包装元素。Nuxt 会通过 id 移除该元素,因此修改 spaLoaderAttrs 时请保留 id。

你也可以将实验选项 spaLoadingTemplateLocation 设为 'within',让模板渲染在应用根元素内部。这种情况下,Vue 挂载应用后模板就会立即移除,因此首个页面准备好渲染之前,屏幕可能会暂时空白。

配置

Nuxt 会在项目及各个 layer 的 app/ 目录(更准确地说,是 dir.app 指定的目录)中查找 spa-loading-template.html。

你可以通过 spaLoadingTemplate 选项修改此行为:

  • 使用路径指定其他 HTML 文件。路径相对于 srcDir,默认值为 app/。
  • 设为 true,在找不到文件时使用 Nuxt 内置的加载界面。
  • 设为 false,完全禁用加载模板。
export default defineNuxtConfig({
  ssr: false,
  spaLoadingTemplate: 'my-loader.html',
})
Weitere Informationen findest du unter Docs > Guide > Concepts > Rendering#client Side Rendering.