学习 Nuxt.js 的预渲染功能,实现静态站点生成 (SSG) 和构建时优化
预渲染 (Prerendering) 是在构建时将动态页面转换为静态 HTML 文件的过程。 这样可以提供更好的 SEO、更快的首屏加载速度,并且可以部署到 CDN 上。
搜索引擎可以直接抓取预渲染的 HTML 内容
无需等待 JavaScript 执行,直接显示内容
静态文件可以缓存在全球 CDN 节点
export default defineNuxtConfig({
// 启用预渲染模式
nitro: {
prerender: {
// 预渲染路由
routes: [
'/',
'/about',
'/blog',
'/learn-nuxt/prerender'
],
// 自动发现链接并预渲染
crawlLinks: true,
// 忽略某些路由
ignore: ['/admin', '/api']
}
},
// 或者使用 ssr: false 进行 SPA 模式
ssr: true, // 保持 SSR 以获得更好的预渲染效果
// 静态站点生成
target: 'static'
})
# 生成静态站点
npm run generate
# 或者使用 build 命令(会自动预渲染)
npm run build
# 预览生成的站点
npm run preview
路由: /learn-nuxt/prerender
生成时间: 2025/11/12 11:00:04
是否预渲染: 否
构建模式:
// nuxt.config.ts - 动态路由配置
export default defineNuxtConfig({
nitro: {
prerender: {
routes: async () => {
// 获取所有博客文章的 slug
const posts = await $fetch('/api/blog/posts')
return posts.map(post => '/blog/' + post.slug)
}
}
}
})
// pages/blog/[slug].vue - 页面组件
// 这个函数会在预渲染时被调用
export async function getStaticPaths() {
const posts = await $fetch('/api/blog/posts')
return posts.map(post => ({
params: { slug: post.slug }
}))
}
这是预渲染的静态内容,在构建时就已经生成
✅ 已预渲染SEO 友好,加载速度快
✅ 已预渲染0
| 渲染方式 | 首屏时间 | SEO | 缓存 | 适用场景 |
|---|---|---|---|---|
| 预渲染 (SSG) | 最快 | 优秀 | 最佳 | 静态内容 |
| 服务端渲染 (SSR) | 快 | 优秀 | 中等 | 动态内容 |
| 客户端渲染 (SPA) | 慢 | 较差 | 中等 | 交互应用 |
# 查看预渲染的路由
npx nuxi analyze
# 构建并查看输出
npm run build -- --analyze
# 本地预览静态站点
npm run preview