首页
/ Next.js静态站点生成(SSG)深度解析与实践指南

Next.js静态站点生成(SSG)深度解析与实践指南

2025-07-05 01:43:42作者:段琳惟

什么是静态站点生成(SSG)

静态站点生成(Static Site Generation,简称SSG)是Next.js提供的核心渲染策略之一,它允许在构建时(build time)预渲染页面。与传统的服务器端渲染(SSR)不同,SSG在项目构建阶段就生成完整的HTML页面,这些页面可以直接被CDN缓存,提供极快的访问速度。

SSG工作原理

当使用SSG时,Next.js会在执行构建命令时完成以下工作:

  1. 执行页面组件代码
  2. 调用可能存在的getStaticPropsgetStaticPaths方法获取数据
  3. 生成静态HTML文件
  4. 将这些HTML文件部署到CDN

当用户请求页面时,CDN会直接返回预先生成的HTML,无需服务器实时处理,这显著提高了响应速度。

SSG的两种使用场景

1. 无数据依赖的静态生成

对于内容完全静态、不依赖外部数据的页面,Next.js会自动使用SSG:

function About() {
  return <div>关于我们</div>
}

export default About

这种页面构建时直接生成HTML,是最简单的SSG应用场景。

2. 有数据依赖的静态生成

场景一:页面内容依赖外部数据

当页面内容需要从CMS、API等外部数据源获取时,可以使用getStaticProps

export default function Blog({ posts }) {
  return (
    <ul>
      {posts.map((post) => (
        <li key={post.id}>{post.title}</li>
      ))}
    </ul>
  )
}

export async function getStaticProps() {
  const res = await fetch('https://api.example.com/posts')
  const posts = await res.json()

  return {
    props: {
      posts,
    }
  }
}

getStaticProps在构建时执行,获取的数据会作为props传递给页面组件。

场景二:页面路径依赖外部数据

对于动态路由页面(如pages/posts/[id].js),如果需要预渲染特定路径,可以使用getStaticPaths

export async function getStaticPaths() {
  const res = await fetch('https://api.example.com/posts')
  const posts = await res.json()

  const paths = posts.map(post => ({
    params: { id: post.id.toString() }
  }))

  return { paths, fallback: false }
}

export async function getStaticProps({ params }) {
  const res = await fetch(`https://api.example.com/posts/${params.id}`)
  const post = await res.json()

  return { props: { post } }
}

getStaticPaths决定哪些路径会被预渲染,getStaticProps则获取对应路径的具体数据。

SSG的最佳实践

适用场景

SSG特别适合以下类型的网站:

  • 企业官网和营销页面
  • 博客和技术文档
  • 产品展示型网站
  • 内容更新频率较低的网站

性能优化技巧

  1. 增量静态再生(ISR):Next.js允许在构建后更新静态页面,结合revalidate参数可以实现定时重新生成。

  2. CDN缓存:充分利用CDN缓存静态页面,设置合适的缓存头。

  3. 代码分割:Next.js自动进行代码分割,只需按需导入组件。

常见问题解决方案

  1. 数据更新问题:对于频繁更新的数据,可以结合客户端数据获取或使用ISR。

  2. 大型网站构建:对于有大量页面的网站,可以:

    • 只预渲染热门页面
    • 使用fallback: true实现按需生成
    • 分批次构建
  3. 敏感数据处理:不要在客户端代码中包含敏感信息,可以通过API路由处理。

SSG与其它渲染策略对比

特性 SSG SSR CSR
渲染时机 构建时 请求时 客户端
性能 最优 中等 依赖网络
SEO支持 完全支持 完全支持 需要额外处理
数据实时性
适用场景 内容稳定 个性化强 交互复杂

实际案例参考

Next.js官方提供了丰富的SSG应用案例,包括与各种CMS系统的集成:

  • 内容管理系统:WordPress、Sanity、Contentful等
  • 电商平台:产品展示页面
  • 文档系统:技术文档、帮助中心
  • 博客系统:文章展示和归档

这些案例展示了如何将SSG应用于实际项目,处理不同类型的数据源和业务需求。

总结

静态站点生成是Next.js最强大的特性之一,它通过预渲染技术提供了卓越的性能和用户体验。对于内容相对稳定的网站,SSG应该作为首选渲染策略。通过合理使用getStaticPropsgetStaticPaths,开发者可以构建出高性能、易维护的现代Web应用。