预渲染

Nuxt 允许页面在构建时静态渲染以提升某些性能或 SEO 指标

Nuxt 允许将应用中的部分页面在构建时渲染。Nuxt 在请求这些页面时会提供预构建好的页面,而不是在运行时动态生成它们。

Read more in Nuxt 渲染模式.

基于爬虫的预渲染

使用 nuxt generate 命令 来构建并使用 Nitro 爬虫预渲染你的应用。该命令类似于将 nitro.static 选项设置为 truenuxt build,或运行 nuxt build --prerender

这会构建你的网站,启动一个 nuxt 实例,并且默认会预渲染根页面 /,以及该页面链接的任何站点页面、这些页面所链接的页面,依此类推。

npx nuxt generate

你现在可以将 .output/public 目录部署到任意静态托管服务,或使用 npx serve .output/public 在本地预览。

Nitro 爬虫的工作原理:

  1. 加载应用根路由(/)、~/pages 目录中任何非动态页面以及 nitro.prerender.routes 数组中列出的其他路由的 HTML。
  2. 将 HTML 和 payload.json 保存到 ~/.output/public/ 目录,以便静态提供。
  3. 在 HTML 中查找所有锚点标签(<a href="...">)来导航到其他路由。
  4. 对找到的每个锚点重复步骤 1-3,直到没有更多锚点可以抓取。

理解这一点很重要,因为未被任何可发现页面链接的页面无法被自动预渲染。

阅读有关 nuxt generate 命令的更多内容。

选择性预渲染

你可以在 nuxt.config 文件中手动指定 Nitro 在构建期间会抓取并预渲染的路由,或忽略你不想预渲染的路由,例如 /dynamic

nuxt.config.ts
export default defineNuxtConfig({
  nitro: {
    prerender: {
      routes: ['/user/1', '/user/2'],
      ignore: ['/dynamic'],
    },
  },
})

你可以将此与 crawlLinks 选项结合使用,以预渲染爬虫无法发现的一组路由,例如你的 /sitemap.xml/robots.txt

nuxt.config.ts
export default defineNuxtConfig({
  nitro: {
    prerender: {
      crawlLinks: true,
      routes: ['/sitemap.xml', '/robots.txt'],
    },
  },
})

nitro.prerender 设置为 true 与将 nitro.prerender.crawlLinks 设置为 true 类似。

在 Nitro 文档中阅读有关预渲染的更多内容。

最后,你也可以使用 routeRules 手动配置此行为。

nuxt.config.ts
export default defineNuxtConfig({
  routeRules: {
    // Set prerender to true to configure it to be prerendered
    '/rss.xml': { prerender: true },
    // Set it to false to configure it to be skipped for prerendering
    '/this-DOES-NOT-get-prerendered': { prerender: false },
    // Everything under /blog gets prerendered as long as it
    // is linked to from another page
    '/blog/**': { prerender: true },
  },
})
阅读有关 Nitro 的 routeRules 配置的更多内容。

作为简写,你也可以在页面文件中使用 defineRouteRules 来配置此项。

该功能为实验性功能,使用前必须在你的 nuxt.config 中启用 experimental.inlineRouteRules 选项。
app/pages/index.vue
<script setup>
// Or set at the page level
defineRouteRules({
  prerender: true,
})
</script>

<template>
  <div>
    <h1>Homepage</h1>
    <p>Pre-rendered at build time</p>
  </div>
</template>

这将被转换为:

nuxt.config.ts
export default defineNuxtConfig({
  routeRules: {
    '/': { prerender: true },
  },
})

运行时预渲染配置

prerenderRoutes

你可以在运行时于 Nuxt 上下文 中使用此方法,为 Nitro 添加更多需要预渲染的路由。

app/pages/index.vue
<script setup>
prerenderRoutes(['/some/other/url'])
prerenderRoutes('/api/content/article/my-article')
</script>

<template>
  <div>
    <h1>This will register other routes for prerendering when prerendered</h1>
  </div>
</template>
Read more in prerenderRoutes.

prerender:routes Nuxt hook

这个钩子在预渲染之前被调用,用于注册额外的路由。

nuxt.config.ts
export default defineNuxtConfig({
  hooks: {
    async 'prerender:routes' (ctx) {
      const { pages } = await fetch('https://api.some-cms.com/pages').then(
        res => res.json(),
      )
      for (const page of pages) {
        ctx.routes.add(`/${page.name}`)
      }
    },
  },
})

prerender:generate Nitro hook

该钩子在预渲染过程中对每个路由分别调用。你可以用它对每个被预渲染的路由进行更精细的处理。

nuxt.config.ts
export default defineNuxtConfig({
  nitro: {
    hooks: {
      'prerender:generate' (route) {
        if (route.route?.includes('private')) {
          route.skip = true
        }
      },
    },
  },
})