预渲染
Nuxt 允许您选择应用程序中的部分页面在构建时进行渲染。Nuxt 会在请求时直接提供预构建的页面,而不是动态生成它们。
基于爬虫的预渲染
使用 nuxt generate 命令来构建并使用 Nitro 爬虫预渲染您的应用程序。该命令类似于将 nitro.static 选项设置为 true 后执行 nuxt build,或者执行 nuxt build --prerender。
这会构建您的站点,启动一个 Nuxt 实例,并默认预渲染根页面 /,以及它所链接的所有站点页面,以及这些页面所链接的页面,依此类推。
npx nuxt generate
yarn nuxt generate
pnpm nuxt generate
bun x nuxt generate
deno x nuxt generate
现在,您可以将 .output/public 目录部署到任何静态托管服务,或者使用 npx serve .output/public 在本地预览。
Nitro 爬虫的工作原理
- 加载应用程序根路由(
/)、~/pages目录中的所有非动态页面,以及nitro.prerender.routes数组中的所有其他路由的 HTML。 - 将 HTML 和
payload.json保存到~/.output/public/目录中,以便进行静态服务。 - 在 HTML 中查找所有指向其他路由的锚点标签(
<a href="...">)。 - 对找到的每个锚点标签重复第 1-3 步,直到没有更多的锚点标签可以爬取。
这一点非常重要,因为未链接到可发现页面的页面无法自动进行预渲染。
Payload(负载)提取
Nuxt 会为以下内容生成 _payload.json:
- 预渲染路由(在构建时)
- ISR/SWR 路由(在首次请求时)
Payload 包含来自 useAsyncData 和 useFetch 的序列化数据。客户端导航会加载这些缓存的 payload,而不是重新获取数据。使用路由规则配置动态路由(如 pages/[...slug].vue):'/**': { isr: true }。
选择性预渲染
您可以手动指定 Nitro 在构建期间获取和预渲染的路由,或者在 nuxt.config 文件中忽略您不想预渲染的路由,例如 /dynamic。
// @errors: 2353
export default defineNuxtConfig({
nitro: {
prerender: {
routes: ['/user/1', '/user/2'],
ignore: ['/dynamic'],
},
},
})
您可以将其与 crawlLinks 选项结合使用,以预渲染一组爬虫无法发现的路由,例如您的 /sitemap.xml 或 /robots.txt。
// @errors: 2353
export default defineNuxtConfig({
nitro: {
prerender: {
crawlLinks: true,
routes: ['/sitemap.xml', '/robots.txt'],
},
},
})
将 nitro.prerender 设置为 true 类似于将 nitro.prerender.crawlLinks 设置为 true。
最后,您可以使用 routeRules 手动进行配置。
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 },
},
})
作为快捷方式,您也可以在页面文件中使用 defineRouteRules 进行配置。
<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>
这将被转换为
export default defineNuxtConfig({
routeRules: {
'/': { prerender: true },
},
})
运行时预渲染配置
prerenderRoutes
您可以在 Nuxt 上下文内的运行时使用此功能,为 Nitro 添加更多要预渲染的路由。
<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>
prerender:routes Nuxt 钩子
这将在预渲染之前被调用,用于注册额外的路由。
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 钩子
这会在预渲染期间为每个路由调用。您可以使用它对每个被预渲染的路由进行细粒度处理。
export default defineNuxtConfig({
nitro: {
hooks: {
'prerender:generate' (route) {
if (route.route?.includes('private')) {
route.skip = true
}
},
},
},
})