ByteNoteByteNote

字节笔记本

2026年5月3日

TanStack Start - 静态预渲染 (Static Prerendering)

API中转
¥120

在构建时生成静态 HTML 文件,提升性能并支持静态站点部署。静态预渲染可以向用户提供预渲染的 HTML 文件而无需动态生成,适用于文档网站、博客和营销页面等静态内容。

什么是静态预渲染

静态预渲染是为应用生成静态 HTML 文件的过程,具有以下优势:

好处描述
更快的内容传递预生成的 HTML 从 CDN 瞬间提供
降低服务器负载无需为每个请求渲染页面
更低的成本静态托管比动态服务器便宜
更好的 SEO搜索引擎可以直接索引 HTML
离线支持可以与 service workers 结合使用

配置预渲染

vite.config.ts 文件中添加 prerender 选项:

ts
// vite.config.ts
import { tanstackStart } from '@tanstack/react-start/plugin/vite'
import viteReact from '@vitejs/plugin-react'

export default defineConfig({
  plugins: [
    tanstackStart({
      prerender: {
        enabled: true,
        autoSubfolderIndex: true,
        autoStaticPathsDiscovery: true,
        concurrency: 14,
        crawlLinks: true,
        filter: ({ path }) => !path.startsWith('/do-not-render-me'),
        retryCount: 2,
        retryDelay: 1000,
        maxRedirects: 5,
        failOnError: true,
        onSuccess: ({ page }) => {
          console.log(`Rendered ${page.path}!`)
        },
      },
      pages: [
        {
          path: '/my-page',
          prerender: { enabled: true, outputPath: '/my-page/index.html' },
        },
      ],
    }),
    viteReact(),
  ],
})

自动静态路由发现

所有静态路径将被自动发现并无缝合并与指定的 pages 配置。路由在以下情况下被排除在自动发现之外:

  • 路径参数路由(例如 /users/$userId),因为它们需要特定的参数值
  • 布局路由(以 _ 为前缀),因为它们不渲染独立页面
  • 没有组件的路由(例如 API 路由)

当启用 crawlLinks 时,如果动态路由从其他页面链接,它们仍可以被预渲染。

爬取链接

当启用 crawlLinks 时(默认:true),TanStack Start 将从预渲染页面中提取链接并预渲染那些链接的页面。如果 / 包含指向 /posts 的链接,那么 /posts 也将自动被预渲染。

tsx
// src/routes/index.tsx
export const Route = createFileRoute('/')({
  component: Home,
})

function Home() {
  return (
    <div>
      <h1>Home</h1>
      <Link to="/posts">View Posts</Link>
    </div>
  )
}
选项类型默认值描述
crawlLinksbooleantrue是否爬取链接
maxRedirectsnumber5最大重定向次数
concurrencynumber14并发预渲染作业数
retryCountnumber2失败重试次数
retryDelaynumber1000重试延迟(毫秒)

预渲染策略

策略 1: 全局预渲染

tsx
prerender: {
  enabled: true,
  autoStaticPathsDiscovery: true,
  crawlLinks: true,
}

策略 2: 手动指定路由

tsx
prerender: {
  enabled: true,
  autoStaticPathsDiscovery: false,
  pages: [
    { path: '/' },
    { path: '/about' },
    { path: '/contact' },
  ],
}

策略 3: 混合策略

tsx
prerender: {
  enabled: true,
  autoStaticPathsDiscovery: true,
  pages: [
    { path: '/posts/1', prerender: { enabled: true } },
    { path: '/posts/2', prerender: { enabled: true } },
  ],
}

预渲染输出结构

text
dist/
├── client/
│   ├── _shell.html
│   ├── index.html
│   ├── about/
│   │   └── index.html
│   ├── blog/
│   │   ├── index.html
│   │   └── post-1/
│   │       └── index.html
│   └── assets/
│       ├── index-[hash].js
│       └── index-[hash].css
└── server/
    └── index.mjs
选项默认值描述
outputPathdist/client静态文件输出目录
autoSubfolderIndexfalse使用 /page/index.html 而不是 /page.html

预渲染 vs 服务器渲染

特性预渲染服务器渲染
生成时间构建时请求时
性能最快较快
成本
数据新鲜度构建时数据实时数据
适用场景静态内容动态内容

配置速查

配置默认值用途
enabledfalse启用预渲染
autoStaticPathsDiscoverytrue自动发现静态路由
crawlLinkstrue爬取链接
concurrency14并发作业数
retryCount2重试次数
filter-过滤函数
分享: