预渲染
Nuxt 允许在构建时渲染应用程序中的特定页面。Nuxt 将在请求时提供预构建的页面,而不是即时生成它们。
基于爬虫的预渲染
使用 nuxi generate 命令 通过 Nitro 爬虫构建和预渲染您的应用程序。此命令类似于设置了 nitro.static 选项为 true 的 nuxt build,或者运行 nuxt build --prerender。
这将构建您的站点,启动一个 nuxt 实例,并且默认情况下,预渲染根页面 / 以及您的站点链接到的任何其他页面,以及这些页面链接到的任何其他页面,依此类推。
npx nuxi generate
yarn dlx nuxi generate
pnpm dlx nuxi generate
bun x nuxi generate
您现在可以将 .output/public 目录部署到任何静态托管服务,或者使用 npx serve .output/public 在本地预览它。
Nitro 爬虫的工作原理:
- 加载应用程序根路由 (
/) 的 HTML、~/pages目录中任何非动态页面以及nitro.prerender.routes数组中的任何其他路由。 - 将 HTML 和
payload.json保存到~/.output/public/目录中,以便静态提供。 - 在 HTML 中查找所有锚标记 (
<a href="...">) 以导航到其他路由。 - 对找到的每个锚标记重复步骤 1-3,直到没有更多锚标记可爬取为止。
这一点很重要,因为未链接到可发现页面的页面无法自动预渲染。
选择性预渲染
您可以在 nuxt.config 文件中手动指定 Nitro 在构建期间将获取并预渲染的路由,或者忽略您不想预渲染的路由(如 /dynamic):
export default defineNuxtConfig({
nitro: {
prerender: {
routes: ["/user/1", "/user/2"],
ignore: ["/dynamic"],
},
},
});
您可以将此与 crawlLinks 选项结合使用,以预渲染爬虫无法发现的一组路由,例如您的 /sitemap.xml 或 /robots.txt:
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 hook
这在预渲染之前调用,用于注册额外的路由。
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;
}
},
},
},
});