透過 100 多個技巧學習 Nuxt!

預渲染

Nuxt 允許在建置時靜態渲染頁面,以改善某些效能或 SEO 指標

Nuxt 允許您在建置時預先渲染應用程式中的特定頁面。當請求這些頁面時,Nuxt 會提供預先建置的頁面,而不是即時產生它們。

請在Nuxt 渲染模式中閱讀更多相關資訊。

基於爬蟲的預先渲染

使用 nuxi generate 指令,透過 Nitro 爬蟲來建置並預先渲染您的應用程式。此指令類似於將 nitro.static 選項設定為 truenuxt build,或是執行 nuxt build --prerender

這會建置您的網站,啟動一個 Nuxt 實例,並預設預先渲染根頁面 /,以及您網站中任何連結到的頁面、這些頁面連結到的任何頁面,依此類推。

npx nuxi 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,直到沒有更多錨點標籤可以爬取為止。

了解這一點很重要,因為未連結到可被發現頁面的頁面無法自動預先渲染。

閱讀更多關於 nuxi 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 選項。
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 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;
        }
      },
    },
  },
});