Nuxt Nation 大会即将到来。加入我们,时间为 11 月 12 日至 13 日。

预渲染

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

Nuxt 允许选择性地渲染应用程序中的页面。当请求这些页面时,Nuxt 将提供预构建的页面,而不是动态生成它们。

Nuxt 渲染模式中了解更多信息。

基于爬取的预渲染

使用nuxi generate 命令 通过Nitro 爬虫构建和预渲染应用程序。此命令类似于 nuxt build,其中 nitro.static 选项设置为 true,或者运行 nuxt build --prerender

这将构建您的网站,启动一个 Nuxt 实例,并且默认情况下,预渲染根页面 / 以及其链接到的任何页面、这些页面链接到的任何页面,依此类推。

npx nuxi generate

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

Nitro 爬虫的工作原理

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

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

阅读有关 nuxi generate 命令的更多信息。

选择性预渲染

您可以手动指定 Nitro 在构建期间将获取和预渲染的路由,或者忽略您不想预渲染的路由(例如 nuxt.config 文件中的 /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 选项。
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 添加更多要预渲染的路由。

pages/index.vue
<script setup>
prerenderRoutes(["/some/other/url"]);
</script>

<template>
  <div>
    <h1>This will register other routes for prerendering when prerendered</h1>
  </div>
</template>
prerenderRoutes 中了解更多信息。

prerender:routes Nuxt 钩子

在预渲染之前调用此钩子,以注册其他路由。

nitro.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 钩子

在预渲染期间对每个路由调用此钩子。您可以使用它对每个要预渲染的路由进行细粒度的处理。

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