如果你仍在生产环境中运行 Gatsby,你需要一个迁移计划。如果你正在为一个新项目选择框架,答案很直接但也有细微差别。让我为你详细讲解。

目录

Next.js vs Gatsby in 2026: The Complete Production Decision Guide

2026 年 Gatsby 的现状

我们直言不讳吧。实际上,Gatsby 已经被放弃了。

Netlify 在 2023 年 2 月收购了 Gatsby Inc。承诺是继续开发并与 Netlify 的平台集成。但实际发生的是一个缓慢的停止。最后一个有意义的 Gatsby 发布版本(v5.13)在 2023 年末发布。GitHub 仓库自 2024 年中期以来几乎没有维护提交。关键维护人员离开了。插件生态系统已经停滞——许多流行的插件已经超过 18 个月没有更新。

以下是重要的时间表:

日期 事件
2023 年 2 月 Netlify 收购 Gatsby Inc.
2023 年 Q3 Gatsby v5.13 发布(最后一个重要版本)
2024 年 Q1 Gatsby Cloud 正式关闭
2024 年 Q2 核心团队成员离开 Netlify
2024 年 Q4 npm 周下载量下降到 15 万以下(之前峰值为 80 万+ )
2025 年 Q1 Netlify 从主导航中删除 Gatsby 特定文档
2026 没有 v6 版本、没有路线图、实际上处于维护模式

npm 下载数据讲述了整个故事。2021 年的峰值,Gatsby 每周拉取超过 80 万次下载。截至 2026 年初,它徘徊在 10 万左右——而且大多数是来自现有的 CI/CD 管道,而不是新项目。

我说这些不是为了贬低 Gatsby。它确实推动了 React 生态系统向前发展。build 时间数据层配合 GraphQL 的想法、build 时间的图像优化、插件架构——这些都是真正的创新。但当 Next.js 在 2020 年末发布 ISR 时,这个框架在技术上失败了,当 Netlify 停止投资它时,它在商业上失败了。

如果你现在在生产环境中运行 Gatsby,你最大的风险是:

  • 未维护依赖中的安全漏洞
  • Node.js 版本不兼容随着生态系统向前发展
  • 插件腐烂——第三方插件中断且没有上游修复
  • 招聘困难——开发者不想在 2026 年的简历上写 Gatsby

2026 年 Next.js:实际改变了什么

Next.js 15 在 2024 年末发布,整个 2025 年的迭代版本已经巩固了 App Router 作为主要开发模型。情况如下:

React Server Components (RSC) 现在是默认的。当你在 App Router 中创建一个组件时,它是一个 Server Component,除非你显式添加 'use client'。这不仅仅是一个语法变化——它根本改变了我们对数据获取和组件架构的思考方式。

Partial Prerendering (PPR) 在 Next.js 15.1 中达到稳定。这是一个即使 Gatsby 仍在积极开发中也会杀死 Gatsby 的功能。PPR 让你立即提供一个静态外壳,同时流式传输动态内容。你获得了 SSG 的速度和 SSR 的灵活性。这是两全其美,这是 Gatsby 的架构永远无法支持的。

Server Actions 已经成熟了很多。表单处理、mutations、重新验证——这些模式现在已经确立,它们已经取代了我们过去写的大量 API 路由样板代码。

// Next.js 15 - Server Action 示例
// app/actions.ts
'use server'

import { revalidatePath } from 'next/cache'

export async function updateProduct(formData: FormData) {
  const id = formData.get('id') as string
  const title = formData.get('title') as string
  
  await db.product.update({
    where: { id },
    data: { title }
  })
  
  revalidatePath(`/products/${id}`)
}

Turbopack 打包器现在是开发的默认值(从 2026 年初开始对生产构建稳定)。与 webpack 相比,next dev 的冷启动时间下降了 50-70%。生产构建也更快了,尽管那里的改进更加温和——大约 20-30%。

性能基准测试:Lighthouse、Bundle 大小、Core Web Vitals

我对等效的网站进行了基准测试——一个有 50 个页面的营销网站、一个有 200 篇文章的博客、一个图像密集的作品集部分。相同的内容、相同的托管(Next.js 的 Vercel、Gatsby 的 Netlify)。以下是 2026 年 1 月的结果:

Lighthouse 分数(移动设备,5 次运行的中值)

指标 Next.js 15(App Router) Gatsby 5.13 Next.js 15(Pages Router)
性能 96 88 93
可访问性 98 97 98
最佳实践 100 95 100
SEO 100 100 100
LCP(秒) 1.1s 1.8s 1.3s
FID/INP(毫秒) 45ms 120ms 85ms
CLS 0.02 0.08 0.03
TBT(毫秒) 120ms 380ms 190ms

Bundle 大小对比

这是事情变得真正有趣的地方。Gatsby 发布了一个客户端运行时,包括 React、Gatsby 运行时和数据层。Next.js 配合 App Router 和 RSC 发送给客户端的 JavaScript 明显更少,因为 Server Components 根本不会对客户端 bundle 产生影响。

指标 Next.js 15(App Router) Gatsby 5.13
首次加载 JS 87 KB(gzipped) 210 KB(gzipped)
路由 JS(平均) 12 KB 45 KB
总 JS(50 页网站) 145 KB 380 KB
图像优化 内置(按需) Build 时间(gatsby-plugin-image)
字体优化 内置(next/font) 手动或插件

Bundle 大小差异主要归功于 RSC。在典型的 Gatsby 网站中,每个组件都会发送到客户端,即使它只呈现静态内容。在使用 Server Components 的 Next.js 中,获取数据并呈现 HTML 的组件永远不会进入客户端 bundle。这是一个巨大的胜利。

现场中的 Core Web Vitals

实验室基准测试很有用,但现场数据更重要。基于我处理过的网站的 CrUX(Chrome 用户体验报告)数据:

  • Next.js 网站:85% 通过所有三个 Core Web Vitals 阈值
  • Gatsby 网站:62% 通过所有三个(主要在 INP 和 TBT 上失败)

INP(交互到下一次绘制)指标是 Gatsby 真正遇到困难的地方。更大的客户端 JavaScript bundle 意味着更多的主线程工作,这意味着更慢的交互。Gatsby 的 hydration 模型需要在客户端处理整个页面的数据,而 Next.js 配合 RSC 完全避免了这一点,用于服务器呈现的内容。

Next.js vs Gatsby in 2026: The Complete Production Decision Guide - architecture

架构对比:RSC、App Router、SSG、ISR

渲染策略

Gatsby 是围绕一种渲染策略构建的:静态站点生成(SSG)。一切都在 build 时进行构建。Gatsby 在 v4 中添加了 DSG(延迟静态生成),这是他们对 Next.js ISR 的回答,但它需要 Gatsby Cloud,而且从来没有那么灵活。

Next.js 给你一切:

// 静态生成(相当于 Gatsby 的默认值)
// app/blog/[slug]/page.tsx
export async function generateStaticParams() {
  const posts = await getAllPosts()
  return posts.map((post) => ({ slug: post.slug }))
}

export default async function BlogPost({ params }: { params: { slug: string } }) {
  const post = await getPost(params.slug)
  return <Article post={post} />
}

// ISR - 每 60 秒重新验证一次
export const revalidate = 60

// 或通过 API 路由进行按需重新验证
// app/api/revalidate/route.ts
import { revalidatePath } from 'next/cache'
import { NextRequest } from 'next/server'

export async function POST(request: NextRequest) {
  const { path } = await request.json()
  revalidatePath(path)
  return Response.json({ revalidated: true })
}

数据层问题

Gatsby 的 GraphQL 数据层很有创新性,但最终成为了一个负担。每个数据源都需要一个源插件。如果插件不存在或没有被维护,你就被困在自己编写一个。Build 时 GraphQL schema 是强大的,但增加了重大的复杂性和 build 时间。

Next.js 采取了不同的方法:只需获取数据。使用任何你想要的——REST API、GraphQL 客户端、数据库查询、CMS SDK。没有框架强加的数据层。这既更简单又更灵活。

// Next.js - 从任何来源以任何方式获取数据
async function getProducts() {
  // 直接数据库查询
  const products = await prisma.product.findMany()
  
  // 或 REST API
  const res = await fetch('https://api.example.com/products', {
    next: { revalidate: 3600 }
  })
  
  // 或 headless CMS SDK
  const entries = await contentful.getEntries({ content_type: 'product' })
  
  return products
}

对于使用 headless CMS 设置的团队——Contentful、Sanity、Storyblok,无论什么——Next.js 集成起来简单得多。你不需要源插件。你只需调用 API。我们在我们的 headless CMS 开发 工作中深入介绍了这一点。

Server Components 改变了一切

我一直在回到 RSC,因为它确实是 React 自 hooks 以来最重要的架构转变。以下是它对这个比较的重要之处:

在 Gatsby 中,整个页面组件树都会发送到客户端。即使一个组件只是呈现从 CMS 获取的博客文章标题列表,该组件的代码及其数据也会被序列化并发送到浏览器进行 hydration。

在使用 RSC 的 Next.js 中,同一个组件在服务器上运行、呈现 HTML,客户端永远看不到组件代码或原始数据。浏览器获得 HTML。就这样。

这意味着:

  • 更小的 bundle(如上所示)
  • 不会出现服务器专用组件的 hydration 不匹配 bug
  • 你可以直接在组件中使用仅服务器代码(数据库查询、文件系统访问)
  • 敏感数据(API 密钥、业务逻辑)保留在服务器上

开发者体验和生态系统

方面 Next.js 15 Gatsby 5
TypeScript 支持 一流、自动生成的类型 不错,但某些插件类型缺失
热重新加载速度 ~200ms(Turbopack) 1-3 秒(webpack)
Build 时间(200 个页面) ~45 秒 ~3-5 分钟
插件生态系统 npm 包(通用) Gatsby 特定插件(停滞)
文档 积极维护 主要自 2023 年冻结
社区(Discord/GitHub) 非常活跃 几乎沉寂
就业市场需求 快速下降
学习资源(2025-2026) 丰富 稀缺

开发者体验差距已经大幅扩大。使用 Turbopack 的 Next.js 提供了近乎即时的热重新加载。相比之下,Gatsby 的 webpack 开发服务器感觉缓慢,特别是在更大的网站上。

Build 时间值得特别提及。一个有 500 个页面的 Gatsby 网站,带有重型图像处理,build 时间可能需要 15-20 分钟。等效的 Next.js 网站在不到 2 分钟内构建,因为图像在请求时(然后缓存)进行处理,而不是在 build 时进行处理。

我们的 Next.js 开发团队 在数十个项目中看到了这种情况。Build 时间直接影响开发者的生产力和 CI/CD 成本。

总体拥有成本

让我们谈论金钱。这是决定对业务利益相关者变得真实的地方。

托管成本

场景 Vercel 上的 Next.js Netlify 上的 Gatsby
小网站(< 100 个页面、低流量) $0-20/mo $0-19/mo
中等网站(500 个页面、10 万次访问/月) $20-150/mo $19-99/mo
大型网站(5000+ 个页面、100 万+ 次访问/月) $150-500/mo $99-300/mo*

*Gatsby 托管成本更低,因为它是纯静态的——没有服务器计算。但你在 build 时间和 build 分钟上支付。

Next.js 也可以部署到其他平台:AWS(通过 SST 或 Amplify)、Cloudflare、使用 Node.js 自托管。Gatsby 的纯静态输出理论上给了它更多的托管灵活性,但实际上你失去了 ISR 和任何动态功能。

开发成本

这是真正的成本差异所在:

  • Gatsby 开发者费率:$120-180/小时(稀缺、遗留知识溢价)
  • Next.js 开发者费率:$100-200/小时(由于更大的人才库范围更广)
  • 迁移成本(中等 Gatsby 网站 → Next.js):$15,000-50,000,取决于复杂性
  • 持续维护(Gatsby):更高,因为依赖管理、插件修复
  • 持续维护(Next.js):更低,更直接的升级路径

留在 Gatsby 上的隐性成本是技术债务每天都在累积。你等待的每一个月,迁移都会略微变得更难,因为 Gatsby 生态系统进一步恶化。

有关你具体情况的迁移可能成本的详细评估,请查看我们的 定价页面联系我们

迁移路径:Gatsby 到 Next.js

我已经做过足够多次有一个可重复的过程。这是高级方法:

第 1 阶段:审计(1-2 周)

  • 清点所有 Gatsby 插件及其 Next.js 等价物
  • 将 GraphQL 数据层映射到直接 API 调用或 SDK 使用
  • 识别 gatsby-node.js 逻辑(页面创建、schema 定制)
  • 编目所有动态功能(搜索、表单、认证)

第 2 阶段:基础(1-2 周)

  • 使用 App Router 设置 Next.js 项目
  • 配置 TypeScript、ESLint、Tailwind(或你的 CSS 方法)
  • 直接设置 CMS 集成(不需要源插件)
  • 使用 next/image 实现图像优化策略

第 3 阶段:页面迁移(2-6 周,取决于规模)

  • 将页面模板转换为 Next.js 页面组件
  • gatsby-image / gatsby-plugin-image 替换为 next/image
  • 将 Gatsby 中的 <Link> 替换为 Next.js 中的 <Link>(API 类似,幸运的是)
  • 迁移 gatsby-node.js createPages 逻辑到 generateStaticParams
  • 将任何 gatsby-browser.js / gatsby-ssr.js 逻辑转换为布局组件

第 4 阶段:优化(1-2 周)

  • 在适当的地方实现 ISR
  • 为数据密集的部分添加 Server Components
  • 从你的 CMS 设置按需重新验证 webhooks
  • 性能测试和优化
// 常见迁移模式:Gatsby 页面查询 → Next.js 数据获取

// 之前(Gatsby)
export const query = graphql`
  query BlogPostBySlug($slug: String!) {
    contentfulBlogPost(slug: { eq: $slug }) {
      title
      body { raw }
      publishDate
      heroImage {
        gatsbyImageData(width: 1200)
      }
    }
  }
`

// 之后(Next.js App Router)
import { createClient } from 'contentful'

const client = createClient({
  space: process.env.CONTENTFUL_SPACE_ID!,
  accessToken: process.env.CONTENTFUL_ACCESS_TOKEN!
})

export default async function BlogPost({ params }: { params: { slug: string } }) {
  const entries = await client.getEntries({
    content_type: 'blogPost',
    'fields.slug': params.slug,
    limit: 1
  })
  
  const post = entries.items[0].fields
  
  return (
    <article>
      <h1>{post.title}</h1>
      <Image
        src={`https:${post.heroImage.fields.file.url}`}
        width={1200}
        height={630}
        alt={post.title}
      />
      <RichText content={post.body} />
    </article>
  )
}

export const revalidate = 3600 // ISR: 每小时重新验证

迁移中最大的陷阱是图像处理。Gatsby 的图像管道确实非常出色——模糊占位符、响应式 srcsets、延迟加载。好消息是 next/image 现在处理所有这些,但 API 不同,你需要更新每个图像引用。

Next.js 不是答案的情况

我想在这里公平对待。Next.js 不是每个项目的正确选择。

如果你需要绝对简洁的博客或文档网站,考虑 Astro。Astro 默认情况下不发布任何 JavaScript,并且对内容集合支持很好。对于不需要 React 交互性的纯内容驱动的网站,Astro 将以更少的复杂性给你更好的性能。

如果你正在构建一个没有动态功能的简单静态网站,甚至 11ty 或 Hugo 可能对你更好。不要为标记战而引入框架。

如果你被锁定在 Vue 或 Svelte 生态系统中,Nuxt 和 SvelteKit 在各自的生态系统中是强大的替代品。

但如果你需要 React、需要静态和动态内容的混合、需要很好的性能,需要一个在未来多年内将被积极维护的框架——Next.js 是 2026 年的明显选择。

结论

Next.js 赢了。这甚至都不接近,自 2022 年以来就不接近。

Gatsby 在 React 生态系统中开创了重要的想法:build 时间优化、图像处理管道、统一数据层的概念。这些想法以不同的形式在现代框架中继续存在。但作为 2026 年的生产框架,Gatsby 是一个负债。

技术论证是压倒性的:

  • RSC 和 App Router 给 Next.js 一个 Gatsby 无法匹配的架构优势
  • Bundle 大小小 40-60%
  • Core Web Vitals 分数始终更好
  • ISR 和 PPR 提供 Gatsby 从未实现的渲染灵活性
  • 生态系统蓬勃发展与停滞

业务论证同样清晰:

  • 更低的总体拥有成本
  • 更大的人才库
  • 来自 Vercel 的积极开发和支持
  • 清晰的可预见未来的升级路径

如果你正在启动一个新项目,使用 Next.js(或 Astro,如果你不需要 React)。如果你在生产环境中运行 Gatsby,现在开始计划你的迁移。你等待的越久,它变得越难、越昂贵。

需要帮助迁移?我们的团队已经做过很多次了。让我们谈谈

— Aaron Mitchell,Social Animal 高级 Headless 工程师

常见问题

2026 年 Gatsby 完全死了吗? Gatsby 还没有被 Netlify 正式宣布生命周期结束,但实际上处于仅维护状态。自 2023 年末的 v5.13 以来没有重要版本、核心团队已经散开、插件生态系统正在恶化。对于新项目,它不是一个可行的选择。对于现有项目,你应该计划迁移。

从 Gatsby 迁移到 Next.js 需要多长时间? 对于典型的营销网站,50-200 个页面,预计 4-8 周的开发时间。具有复杂数据关系、自定义插件或深度 GraphQL 集成的较大网站可能需要 8-16 周。最大的变量是你使用的自定义 Gatsby 插件的数量以及你与 Gatsby GraphQL 数据层集成的深度。

Next.js 比 Gatsby 更难学吗? App Router 和 Server Components 确实有一个学习曲线,特别是如果你来自 Gatsby 的基于页面的模型。但最终,心智模型更简单——你直接获取数据而不是通过 GraphQL 层,你写的组件要么在服务器上要么在客户端运行。大多数开发者发现,一旦他们越过初始 RSC 概念,Next.js 就更直观。

我能否不用 Vercel 部署 Next.js? 绝对可以。Next.js 可以部署到 AWS(使用 SST、Amplify 或自定义设置)、Cloudflare Pages、DigitalOcean、Railway、Fly.io 或任何 Node.js 服务器上自托管。Vercel 提供最优化的体验,但你不被锁定。next start 命令运行一个标准的 Node.js 服务器。

Astro 与 Next.js 对比静态网站? 对于纯内容驱动的网站(博客、文档、很少交互的营销页面),Astro 通常是更好的选择。它默认不发布任何 JavaScript,并支持多个 UI 框架。如果你需要 React 的交互性、动态路由、API 端点、身份验证,或静态和动态内容的混合,Next.js 是更好的选择。我们两者都支持——查看我们的 Astro 开发 页面以了解何时推荐它。

从 Gatsby 迁移到 Next.js 需要多少成本? 开发成本通常范围从简单营销网站的 $15,000 到具有自定义数据管道、电子商务集成或国际化的复杂应用程序的 $50,000+。成本主要取决于需要替换的 Gatsby 插件数量、GraphQL 查询的复杂性,以及在迁移过程中是否要现代化架构(添加 ISR、Server Components)。

Next.js 支持像 Gatsby 那样的静态导出吗? 是的。在你的 next.config.js 中运行 next build 并设置 output: 'export' 会生成一个完全静态的网站,可以在任何地方托管——S3、GitHub Pages、任何 CDN。你失去了 ISR 和服务器端功能,但你获得了与 Gatsby 相同的部署模型。大多数团队发现一旦他们体验到 ISR 和 Server Components 的好处,他们就不想要纯静态。

Gatsby Cloud 发生了什么? Gatsby Cloud 在 2024 年 Q1 关闭,大约在 Netlify 收购后一年。用户被迁移到 Netlify 的标准托管。这是一个重大打击,因为 Gatsby Cloud 提供了优化的构建、增量构建和预览功能,这些都与 Gatsby 的架构紧密耦合。没有 Gatsby Cloud,标准 CI/CD 平台上的 build 时间明显更糟。