自2019年以來,我一直在使用Next.js和Gatsby構建生產網站。我親眼看著Gatsby融資4600萬美元,被Netlify收購,然後被悄悄放棄。僅在2025年,我就將三個企業級Gatsby網站遷移到了Next.js。這不是理論上的比較——這是對一個框架的事後總結,以及對另一個框架的誠實評估。

如果您現在仍在生產環境中運行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每週獲得超過800,000次下載。截至2026年初,它徘徊在100,000左右——其中大多數是現有的CI/CD管道,不是新項目。

我這樣說不是為了貶低Gatsby。它確實推動了React生態系統向前發展。構建時數據層與GraphQL、構建時圖像優化、插件架構的想法——這些都是真正的創新。但當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中創建組件時,除非您明確添加'use client',否則它是服務器組件。這不僅僅是語法更改——它從根本上改變了我們對數據獲取和組件架構的思考方式。

部分預渲染(PPR) 在Next.js 15.1中達到穩定版本。這是一項功能,即使Gatsby仍在積極開發中,也會殺死Gatsby。PPR讓您可以立即提供靜態shell,同時流式傳輸動態內容。您獲得了SSG的速度和SSR的靈活性。兩者的最佳組合,這是Gatsby的架構永遠無法支持的。

Server Actions 已經大幅成熟。表單處理、變更、重新驗證——模式現在已經確立,它們替代了我們曾經編寫的許多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 bundler現在是開發的默認值(自2026年初開始對生產構建穩定)。與webpack相比,next dev的冷啟動時間下降了50-70%。生產構建也更快,儘管那裡的改進相對較低——約20-30%。

性能基準測試:Lighthouse、Bundle大小、核心Web指標

我在等效網站上運行了基準測試——一個有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.1秒 1.8秒 1.3秒
FID/INP(毫秒) 45毫秒 120毫秒 85毫秒
CLS 0.02 0.08 0.03
TBT(毫秒) 120毫秒 380毫秒 190毫秒

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
圖像優化 內置(按需) 構建時(gatsby-plugin-image)
字體優化 內置(next/font) 手動或插件

Bundle大小差異主要是由於RSC。在典型的Gatsby網站中,每個組件都被發送到客戶端,即使它只呈現靜態內容。在帶有Server Components的Next.js中,只獲取數據並呈現HTML的組件永遠不會進入客戶端bundle。這是一個巨大的勝利。

現場的核心Web指標

實驗室基準測試很有用,但現場數據更重要。基於我使用過的網站中的CrUX(Chrome用戶體驗報告)數據:

  • Next.js網站:85%通過所有三個核心Web指標閾值
  • Gatsby網站:62%通過所有三個(主要在INP和TBT上失敗)

INP(交互到下一次繪製)指標是Gatsby真正掙扎的地方。更大的客戶端JavaScript bundle意味著更多的主線程工作,這意味著更慢的交互。Gatsby的hydration模型需要在客戶端上處理整個頁面的數據,而帶有RSC的Next.js完全避免了服務器呈現內容的這種情況。

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

架構比較:RSC、App Router、SSG、ISR

渲染策略

Gatsby是圍繞一種渲染策略構建的:靜態網站生成(SSG)。一切都在構建時獲得構建。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數據層是創新的,但最終成為了一種責任。每個數據源都需要一個源插件。如果插件不存在或未維護,您就陷入了困境。構建時GraphQL模式非常強大,但增加了大量的複雜性和構建時間。

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 }
  })
  
  // 或無頭CMS SDK
  const entries = await contentful.getEntries({ content_type: 'product' })
  
  return products
}

對於使用無頭CMS設置的團隊——Contentful、Sanity、Storyblok,無論什麼——Next.js的集成難度要小得多。您不需要源插件。您只需調用API。我們在無頭CMS開發工作中深入介紹了這一點。

Server Components改變了一切

我一直回到RSC,因為這確實是自hooks以來React中最重要的架構轉變。以下是為什麼它對此比較很重要:

在Gatsby中,整個頁面組件樹都被發送到客戶端。即使組件只是呈現從CMS獲取的博客文章標題列表,該組件的代碼及其數據也會被序列化並發送到瀏覽器進行hydration。

在帶有RSC的Next.js中,相同的組件在服務器上運行,呈現HTML,客戶端永遠不會看到組件代碼或原始數據。瀏覽器獲得HTML。就這樣。

這意味著:

  • 更小的bundles(如上所示)
  • 對於純服務器組件,沒有hydration不匹配錯誤
  • 您可以直接在組件中使用純服務器代碼(數據庫查詢、文件系統訪問)
  • 敏感數據(API密鑰、業務邏輯)保留在服務器上

開發人員體驗和生態系統

方面 Next.js 15 Gatsby 5
TypeScript支持 一流的、自動生成的類型 不錯,但某些插件類型缺失
熱重新加載速度 ~200毫秒(Turbopack) 1-3秒(webpack)
構建時間(200頁) ~45秒 ~3-5分鐘
插件生態系統 npm包(通用) Gatsby特定插件(停滯不前)
文檔 主動維護 主要自2023年以來凍結
社區(Discord/GitHub) 非常活躍 近乎沉默
職位市場需求 快速下降
學習資源(2025-2026) 豐富 稀缺

開發人員體驗差距已大幅擴大。帶有Turbopack的Next.js為您提供近乎即時的熱重新加載。相比之下,Gatsby的基於webpack的開發服務器顯得遲緩,特別是在較大的網站上。

構建時間值得特別提及。一個有500頁、大量圖像處理的Gatsby網站可能需要15-20分鐘才能構建。等效的Next.js網站在不到2分鐘內構建,因為圖像在請求時(然後被緩存)而不是在構建時被處理。

我們的Next.js開發團隊在數十個項目中看到了這一點。構建時間直接影響開發人員生產力和CI/CD成本。

總擁有成本

讓我們談談錢。這是決定對業務利益相關者變得真實的地方。

託管成本

場景 Next.js on Vercel Gatsby on Netlify
小型網站(< 100頁、低流量) $0-20/月 $0-19/月
中型網站(500頁、100k次訪問/月) $20-150/月 $19-99/月
大型網站(5000+頁、1M+次訪問/月) $150-500/月 $99-300/月*

*Gatsby託管成本更低,因為它是純靜態的——沒有服務器計算。但您在構建時間和構建分鐘數上付出代價。

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的圖像管道確實很好——模糊向上placeholder、響應式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生態系統中率先提出了重要想法:構建時優化、圖像處理管道、統一數據層的概念。這些想法在現代框架中以不同的形式繼續存在。但作為2026年的生產框架,Gatsby是一個責任。

技術論證是壓倒性的:

  • RSC和App Router為Next.js提供了Gatsby無法匹配的架構優勢
  • Bundle大小小40-60%
  • 核心Web指標得分一致更好
  • ISR和PPR提供了Gatsby永遠無法實現的渲染靈活性
  • 生態系統蓬勃發展與停滯

商業論證同樣清楚:

  • 更低的總擁有成本
  • 更大的人才庫
  • Vercel的主動開發和支持
  • 可預見的未來升級路徑

如果您開始一個新項目,使用Next.js(如果您不需要React,則使用Astro)。如果您在生產環境中運行Gatsby,現在開始計劃遷移。您等待得越久,它變得越難、越昂貴。

需要幫助進行遷移?我們的團隊做過很多次。讓我們談談

— Aaron Mitchell,Social Animal高級無頭工程師

常見問題

Gatsby在2026年完全死了嗎? 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 vs 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中的output: 'export'運行next build會生成完全靜態網站,可以在任何地方託管——S3、GitHub Pages、任何CDN。您失去ISR和服務器端功能,但您獲得與Gatsby相同的部署模型。大多數團隊發現,一旦他們體驗到ISR和Server Components的優勢,他們就不想要純靜態。

Gatsby Cloud發生了什麼? Gatsby Cloud在Q1 2024關閉,大約在Netlify收購後的一年。用戶被遷移到Netlify的標準託管。這是一個重大打擊,因為Gatsby Cloud提供了優化的構建、增量構建和與Gatsby架構緊密耦合的預覽功能。沒有Gatsby Cloud,標準CI/CD平台上的構建時間明顯更差。