六维教程

Nuxt4 SSG 静态生成与预渲染

Nuxt 默认是 SSR(每次请求服务器现渲染),但很多站点内容几乎不变(官网、博客、工具集合),这类站点更适合 SSG(静态站点生成):构建时一次性把所有页面渲染成 HTML 文件,部署到任意静态空间即可,成本低、速度快、SEO 也好。

SSR 与 SSG 的区别

对比 SSR SSG
渲染时机 每次请求时,服务器现渲染 构建时,一次性渲染成 HTML 文件
服务器要求 需要能跑 Node.js 的服务器 任意静态托管(对象存储、GitHub Pages、Nginx)
适合 数据频繁变化、需实时 内容固定或更新慢的站点
首屏与 SEO 同样好

内容不变就选 SSG,省掉运行服务器,内容天天变就保留 SSR。

开启静态生成

Nuxt 通过 nitro.prerender 控制预渲染。告诉它「要预先生成哪些路由」,构建时就会把这些页面渲染成静态 HTML:

// nuxt.config.ts
export default defineNuxtConfig({
  nitro: {
    prerender: {
      // 自动顺着页面间的链接爬取,生成所有能链到的页面
      crawlLinks: true,
      // 也可以显式列出关键路由,确保一定被生成
      routes: ['/', '/tools/case-converter'],
    },
  },
})

配置好后执行:

npm run generate

构建完成后,静态产物在 .output/public/ 目录,里面是每个路由对应的 .html 文件。直接把这个目录丢到任意静态托管就行。

动态路由怎么预渲染

动态路由(如 /tools/[slug])页面内容由参数决定,预渲染时要让 Nuxt 知道有哪些 slug。两种方式:

  1. crawlLinks: true:Nuxt 从首页开始顺着 <NuxtLink> 爬,自动收录所有能访问到的动态页。
  2. 显式 routes:手动列出,适合入口不在站内链接里的页面。

以本教程配套的在线工具站为例,工具列表在代码里,构建时这样确保全部生成:

// nuxt.config.ts(节选)
import { tools } from './app/data/tools'

export default defineNuxtConfig({
  nitro: {
    prerender: {
      crawlLinks: true,
      routes: ['/', ...tools.map((t) => `/tools/${t.slug}`)],
    },
  },
})

纯静态部署

SSG 产物是普通 HTML,不需要 Node 服务器:

  • GitHub Pages:把 .output/public 推到 gh-pages 分支,仓库设置里开启 Pages。
  • 对象存储 + CDN(OSS / S3 / R2):上传目录,套一层 CDN。
  • Nginx / 任意 Web 服务器:把目录作为根目录,配好 try_files 即可。

如果站点内容偶尔更新,重新 npm run generate 再上传一次即可,没有运行时代码要维护。

什么时候仍用 SSR

如果页面数据实时变化(如后台仪表盘、个性化信息流),SSG 不合适——构建时写死的数据会过时。这种情况保留默认 SSR,配合 服务端接口 动态取数,部署时则需要能跑 Node 的服务器,见 部署上线

上一篇
Nuxt4 SEO 与页面元信息
下一篇
Nuxt4 状态管理