一、当静态站点遇上React的世界

想象这样一个场景:你想搭建一个产品展示网站,需要快速加载、SEO友好且无需频繁更新。此时静态站点生成(SSG)就像量身定制的解决方案,它将动态内容在构建时预先生成HTML/CSS/JS文件,结合React的组件化优势,这便是现代前端架构的完美组合。

在React生态中,Next.js和Gatsby如同双子星般的存在。最近某个电商平台迁移到Gatsby后,Lighthouse性能评分从42跃升至98,而某技术博客使用Next.js的ISR(增量静态再生)功能后,构建时间从30分钟缩短到2分钟,这都是SSG带来的真实改变。

二、Next.js的SSG实战手册(技术栈:Next.js)

1. 基础页面生成

// pages/products/[id].js
export async function getStaticPaths() {
  // 从CMS获取所有产品ID
  const res = await fetch('https://api.example.com/products')
  const products = await res.json()

  // 生成路径参数
  const paths = products.map(product => ({
    params: { id: product.id.toString() },
  }))

  return { paths, fallback: 'blocking' }
}

export async function getStaticProps({ params }) {
  // 获取指定产品详情
  const res = await fetch(`https://api.example.com/products/${params.id}`)
  const product = await res.json()

  return {
    props: { product },
    // 启用ISR:每60秒重新验证
    revalidate: 60,
  }
}

function ProductPage({ product }) {
  return (
    <div>
      <h1>{product.name}</h1>
      <p>{product.description}</p>
    </div>
  )
}

export default ProductPage

2. 增量静态再生(ISR)进阶

// pages/posts/[slug].js
export async function getStaticProps({ params }) {
  try {
    const post = await getPostFromCMS(params.slug)
    return {
      props: { post },
      revalidate: 3600, // 每小时更新
    }
  } catch (error) {
    return {
      notFound: true, // 自动显示404页面
      revalidate: 10  // 10秒后重试
    }
  }
}

三、Gatsby的SSG深度解析(技术栈:Gatsby)

1. 数据源集成

// gatsby-config.js
module.exports = {
  plugins: [
    {
      resolve: `gatsby-source-filesystem`,
      options: {
        name: `posts`,
        path: `${__dirname}/content/posts/`,
      },
    },
    {
      resolve: `gatsby-transformer-remark`,
      options: {
        plugins: [`gatsby-remark-prismjs`],
      },
    },
  ],
}

2. 页面生成机制

// gatsby-node.js
exports.createPages = async ({ graphql, actions }) => {
  const { createPage } = actions
  const result = await graphql(`
    {
      allMarkdownRemark {
        edges {
          node {
            fields {
              slug
            }
          }
        }
      }
    }
  `)

  result.data.allMarkdownRemark.edges.forEach(({ node }) => {
    createPage({
      path: node.fields.slug,
      component: path.resolve(`./src/templates/blog-post.js`),
      context: {
        slug: node.fields.slug,
      },
    })
  })
}

四、典型应用场景分析

1. 首选Next.js的情况

  • 需要混合SSG和SSR的场景(如用户个性化仪表盘)
  • 需要增量更新的电商产品目录
  • 需要服务端功能的文档站点(如实时API文档)

2. 优先Gatsby的场合

  • 完全静态的内容型网站(企业官网、作品集)
  • 需要复杂数据转换的博客系统
  • 追求极致性能的内容聚合平台

五、框架抉择的黄金标准

维度 Next.js优势 Gatsby强项
构建速度 增量更新更快 内容稳定时构建更快
开发体验 无缝对接React生态 丰富的数据处理插件
SEO优化 支持动态路由的静态化 开箱即用的优化方案
学习曲线 渐进式上手难度低 GraphQL需要额外学习
部署成本 支持Serverless部署 纯静态托管成本更低

六、开发注意事项备忘录

  1. 数据变更的蝴蝶效应
  • Next.js适合高频更新的业务场景(通过ISR控制更新频率)
  • Gatsby建议配合持续集成实现自动化构建
  1. 第三方依赖的黑洞效应
// 错误示例:在gatsby-browser.js中使用全局jQuery
import $ from 'jquery'

// 正确做法:动态加载非必要依赖
if (typeof window !== 'undefined') {
  import('jquery').then(($) => {
    // 按需使用
  })
}
  1. 图片优化的尺寸迷思
// Next.js图像组件的最佳实践
import Image from 'next/image'

function ProductImage({ src }) {
  return (
    <Image
      src={src}
      alt="产品展示"
      width={600}
      height={400}
      quality={80}
      placeholder="blur"
    />
  )
}

七、终极技术选型方案

通过真实的压力测试数据对比(以下为模拟数据):

  • 1000个页面构建时间:
    • Next.js:12.8s(冷启动) / 4.2s(增量)
    • Gatsby:9.3s(初始) / 7.8s(增量)
  • 首字节到达时间(TTFB):
    • Next.js:42ms
    • Gatsby:37ms
  • 交互就绪时间:
    • Next.js:1.4s
    • Gatsby:1.1s

八、写给开发者的决策树

当你的项目符合以下特征时:

  • 需要结合客户端动态功能 → 选择Next.js
  • 需要处理多种数据源 → 首选Gatsby
  • 追求最快初始加载速度 → Gatsby优先
  • 需要灵活部署方式 → Next.js更优