我自 Pages Router 時代開始就一直在發佈 Next.js 網站,我已經數不清有多少次看到「最佳 CMS」的文章,是由某個顯然只是安裝過一次、跟著快速入門教程走、然後就把它當成評論的人寫的。這篇不是那樣的。

在 Social Animal,我們在多個 CMS 架構上運行生產網站 -- 從使用 Payload CMS 的醫療應用,到服務超過 253,000+ 頁面跨三個不同平台的 Supabase。我們為實際客戶項目評估過 Strapi 5、Sanity 和 Contentful。而你正在閱讀的這個網站?它建立在提交到 Git 儲存庫的 MDX 檔案上。

所以當我說「我們在生產環境中測試了 6 個」時,我是指我們經歷過遷移的麻煩、構建時間的驚喜、關於內容無法發佈的凌晨 3 點 Slack 訊息。以下是我們關於為 2026 年的 Next.js App Router 選擇合適 CMS 的所有學習成果。

目錄

Next.js App Router 2026 最佳 CMS:我們在生產環境中測試了 6 個

為什麼 App Router 改變了 CMS 等式

如果你仍然像使用 Pages Router 時那樣考慮 CMS 選擇,你就會在性能上有所損失。App Router 從根本上改變了數據如何流經 Next.js 應用程序,這對於哪個 CMS 最適合有著直接的影響。

以下是現在重要的內容:

Server Components 是默認的。 你的 CMS 數據獲取發生在服務器上,不會向客戶端發送任何 JavaScript。這意味著具有原生 Node.js SDK 的 CMS,或者更好的是,跳過網絡的本地 API 具有巨大優勢。

React Server Components + fetch 快取。 App Router 的內置 fetch 去重和快取意味著你的 CMS 集成模式看起來完全不同。你不再依賴 getStaticPropsgetServerSideProps。你在編寫直接調用 CMS 的非同步組件。

平行路由和攔截路由。 這些模式解鎖了之前構建起來很麻煩的 CMS 驅動佈局。一個支持靈活內容建模的 CMS(不僅僅是部落格文章和頁面)在這裡會表現出色。

部分預渲染(PPR)。 截至 Next.js 15,PPR 允許你使用動態孔洞提供靜態殼。這完全改變了 ISR 與 SSR 的爭論,這意味著你的 CMS 重新驗證策略比以往任何時候都更重要。

有了所有這些背景,讓我們深入實際的測試。

我們測試的 6 個 CMS(以及我們如何測試它們)

我們的評估不是理論上的。對於每個 CMS,我們要麼發佈了生產頁面,要麼對實際客戶項目進行了深入的技術評估。我們測量了:

  • 特別是針對 App Router 的開發者體驗
  • 不同頁面數量下的構建時間
  • 非開發者團隊成員的內容編輯器 UX
  • 規模定價(不僅僅是免費層)
  • TypeScript 集成品質
  • 重新驗證模式(ISR、按需、webhooks)

讓我們逐一介紹。

1. Payload CMS 3 -- Next.js 的最佳整體選擇

我們的判決:針對 Next.js App Router 的最佳開發者體驗,無可置疑。

Payload CMS 3 是那個讓我重新思考 CMS 可能是什麼的。它不是你通過 HTTP 調用的單獨服務。它住在你的 Next.js 應用程序。相同的儲存庫、相同的部署、相同的 TypeScript 類型。

我們在 SleepDr 上運行 Payload 3 在生產環境中,這是一個擁有 228 頁、多級訪問控制和需要準確的內容的醫療保健平台(它與健康相關,所以錯誤的內容不僅是不好看 -- 它是一個責任問題)。

什麼使 Payload 對 App Router 特別

Local API 是殺手級功能。不是向你的 CMS 發出 HTTP 請求,而是直接導入和調用函數:

// app/blog/[slug]/page.tsx
import { getPayload } from 'payload'
import config from '@payload-config'

export default async function BlogPost({ params }: { params: { slug: string } }) {
  const payload = await getPayload({ config })
  
  const posts = await payload.find({
    collection: 'posts',
    where: {
      slug: { equals: params.slug },
      status: { equals: 'published' },
    },
  })
  
  const post = posts.docs[0]
  if (!post) notFound()
  
  return <Article post={post} />
}

沒有網絡跳躍。沒有 REST 或 GraphQL 開銷。沒有 SDK 要安裝。函數調用是完全類型化的,因為 Payload 從你的集合配置生成 TypeScript 接口。當你重命名字段時,你的 IDE 會立即捕捉到每個損壞的引用。

使用 App Router 的即時預覽

Payload 3 的即時預覽適用於 Server Components。你的內容編輯器在實際站點佈局上實時看到變化 -- 不是管理面板中的近似值。我們為 SleepDr 配置了這個,編輯團隊在一週內從「我需要開發者來檢查這個」變成自給自足的發佈。

實際有效的訪問控制

Payload 的字段級和集合級訪問控制在代碼中定義:

const Posts: CollectionConfig = {
  slug: 'posts',
  access: {
    read: () => true,
    create: ({ req: { user } }) => user?.role === 'editor' || user?.role === 'admin',
    update: ({ req: { user } }) => user?.role === 'admin',
    delete: ({ req: { user } }) => user?.role === 'admin',
  },
  fields: [
    // ...
  ],
}

對於醫療應用,這種粒度不是可選的。它是必需的。

權衡取捨

Payload 在你的基礎設施上運行。如果你想要一個完全託管的 SaaS 體驗,Payload Cloud 存在(起價約 $35/月用於生產),但你仍然負責理解部署。它也是一個 Node.js 運行時依賴,這意味著你的託管需要支持它(Vercel 有效,但成本隨著到你的數據庫的持久連接而上升)。

對於我們的Next.js 開發工作,Payload 3 現在是我們對於超過 5,000 頁的內容豐富網站的默認推薦。

Next.js App Router 2026 最佳 CMS:我們在生產環境中測試了 6 個 - 架構

2. Supabase-as-CMS -- 規模最佳(10K+ 頁面)

我們的判決:嚴格來說不是 CMS,但對於大規模結構化數據集,沒有其他東西能夠接近。

這是非傳統的選擇,也是我最興奮的選擇。Supabase 不以 CMS 的身份進行行銷。它是一個具有身份驗證、儲存和邊緣函數的 PostgreSQL 平台。但當你的「內容」實際上是結構化數據時 -- 名人檔案、企業清單、產品數據庫 -- 傳統 CMS 在規模上崩潰,而 Supabase 甚至沒有出汗。

我們在 Supabase-as-CMS 上運行三個生產網站:

  • DA -- 超過 91,000 頁名人數據跨 30 種語言
  • NAS -- 137,000+ 企業清單
  • HostList -- 25,000+ 主機提供商清單

那是 253,000+ 頁。讓我告訴你當你試著將 91,000 個條目放入傳統無頭 CMS 中會發生什麼:管理面板變得無法使用,構建時間去無窮大,你的賬單突飛猛進。

架構

我們不使用 generateStaticParams 來生成 253K 頁面。我們使用完全動態渲染和積極快取:

// app/[locale]/celebrity/[slug]/page.tsx
import { createClient } from '@/lib/supabase/server'

export default async function CelebrityPage({ params }: Props) {
  const supabase = await createClient()
  
  const { data: celebrity } = await supabase
    .from('celebrities')
    .select('*, social_profiles(*), net_worth_history(*)')
    .eq('slug', params.slug)
    .eq('locale', params.locale)
    .single()
  
  if (!celebrity) notFound()
  
  return <CelebrityProfile data={celebrity} />
}

export const revalidate = 86400 // 每日重新驗證

構建時間?約 10 秒。頁面按需渲染並在邊緣快取。當有人搜索一個我們最近沒有提供的名人時,第一個請求擊中 Supabase(通常從邊緣的 20-50ms),渲染頁面、快取它,之後每個後續訪客都獲得快取版本。

行級安全作為訪問控制

Supabase 的 RLS 策略替代了你通常在 CMS 管理中構建的內容:

CREATE POLICY "Public read access" ON celebrities
  FOR SELECT USING (status = 'published' AND locale = current_setting('app.locale'));

CREATE POLICY "Editor update access" ON celebrities
  FOR UPDATE USING (auth.role() = 'editor');

內容編輯問題

這是誠實的缺點:Supabase 的表格編輯器對開發者來說很不錯,但它不是內容編輯體驗。我們使用 Supabase 的客戶端庫為我們的編輯團隊構建自定義管理界面。如果你不想構建自己的管理 UI,這個方法不適合你。

Supabase Pro 運行 $25/月,即使在 253K 頁面,我們也遠未達到計算或存儲限制。將其與相似規模的 Contentful 或 Sanity 定價比較。

對於我們的無頭 CMS 開發解決方案,我們推薦這個方法用於超過 10,000 個結構化內容頁面的任何項目。

3. Strapi 5 -- 非技術團隊的最佳選擇

我們的判決:最佳視覺內容建模體驗,理想用於當你的編輯者不是開發者時。

我們為一個客戶項目深入評估了 Strapi 5,並編寫了一份廣泛的 Payload vs Strapi 比較(在第 1 頁排名,所以顯然其他人也在問相同的問題)。雖然我們最終為該項目選擇了 Payload,但 Strapi 有明確的用例。

Strapi 5 的 Content-Type Builder 讓非技術團隊成員通過拖放 GUI 創建和修改內容結構。沒有代碼。沒有配置檔。沒有部署。你的行銷經理可以添加一個「證明」內容類型,包含引言、作者、公司和評級字段,而無需提交 Jira 票證。

App Router 集成

Strapi 5 暴露了 REST 和 GraphQL API。與 App Router 的集成很直接,但需要網絡請求:

// lib/strapi.ts
export async function getArticles() {
  const res = await fetch(
    `${process.env.STRAPI_URL}/api/articles?populate=*`,
    {
      headers: { Authorization: `Bearer ${process.env.STRAPI_TOKEN}` },
      next: { revalidate: 60 },
    }
  )
  return res.json()
}

它有效。但與 Payload 的 Local API 相比,你會感受到阻抗不匹配。你正在序列化和反序列化本可以保持進程內的數據。TypeScript 類型需要單獨生成(Strapi 有一個 CLI,在 v5 中有所改進)。

Strapi 5 定價(2026)

計畫 價格 座位 資源
Community 免費(自託管) 無限制 無限制
Team $29/月/座位 5-20 100GB
Business $99/月/座位 自定義 500GB
Enterprise 自定義 自定義 自定義

自託管 Strapi 是真正免費的,運行良好。雲計畫增加託管和優先支持。

4. Sanity -- 即時協作的最佳選擇

我們的判決:最佳即時編輯體驗,但 GROQ 是一個愛它或討厭它的承諾。

我們為 DA 項目(91K 名人頁面)認真評估了 Sanity,然後在選擇 Supabase 之前。Sanity Studio 真的令人印象深刻 -- 它是一個你可以將其自定義到字段級別的 React 應用程序。即時協作無縫工作。兩個編輯可以同時在同一個文檔上工作,Google Docs 風格。

GROQ:強大但有爭議

Sanity 使用 GROQ,它自己的查詢語言:

*[_type == "article" && slug.current == $slug][0] {
  title,
  body,
  "author": author->{ name, image },
  "categories": categories[]->{ title, slug },
  publishedAt
}

GROQ 一旦你學會了實際上很優雅。投影語法(->)用於解析引用在許多用例中比 GraphQL 更好。但它是你的團隊需要學習和維護的另一種查詢語言。當你擊中邊緣情況時,文檔可能會感到薄弱。

為什麼我們沒有為 DA 選擇 Sanity

在 91,000 個文檔,Sanity 的定價變得重要。增長計畫($15/用戶/月)包括 1M API CDN 請求。聽起來很多,直到你意識到一個擁有 91K 頁面、生成不錯流量的網站會快速耗盡這個限制。我們估計 DA 的每月 Sanity 賬單將是 $300-500/月。$25/月的 Supabase Pro 是顯而易見的選擇。

Sanity 對於擁有 50-5,000 個內容項目的網站很出色,其中多個編輯需要協作。媒體公司的編輯團隊喜歡它。

5. Contentful -- 企業級的最佳選擇(預算充足)

我們的判決:最成熟的無頭 CMS,但你會為那個成熟付出代價。

Contentful 自 2013 年起就存在了。它是無頭 CMS,企業團隊默認採用,並且有原因:內容建模很優秀、API 很穩固(Premium 上 99.99% SLA),集成生態系統無與倫比。

我們為多個企業客戶項目評估了 Contentful。內容模型構建器很亮麗、Web 應用程序中的 API 瀏覽器對於調試很有用,webhook 系統與 Next.js 按需重新驗證乾淨集成。

標籤價格

計畫 價格(2026) 內容類型 地區 API 調用
免費 $0 48 2 1M/月
基本 $300/月 48 6 2M/月
Premium 自定義(通常 $3,000+/月) 無限制 無限制 自定義

從免費到基本的跳躍很陡峭。從基本到 Premium 的跳躍是懸崖。如果你是一個年度 SaaS 預算 $50K+ 的企業,Contentful 是一個安全的選擇。如果你是一個試著保持燃燒率低的初創,看別的地方。

App Router 集成

Contentful 的 JavaScript SDK 與 Server Components 很好地工作:

import { createClient } from 'contentful'

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

export async function getPage(slug: string) {
  const entries = await client.getEntries({
    content_type: 'page',
    'fields.slug': slug,
    include: 3,
  })
  return entries.items[0]
}

SDK 維護良好且完全使用 contentful-typescript-codegen 類型化。DX 方面沒有抱怨。

6. Markdown/MDX -- 開發者部落格的最佳選擇

我們的判決:零開銷,最大控制,Git 本地工作流。

這個網站 -- socialanimal.dev -- 運行在 MDX 上。每篇文章是儲存庫中的一個檔案,帶有前言元數據:

---
title: "Next.js App Router 2026 最佳 CMS"
slug: "best-cms-nextjs-app-router-2026"
category: "Resources"
tags: ["nextjs", "cms", "payload", "supabase"]
publishedAt: "2026-01-15"
---

我自 Pages Router 時代開始就一直在發佈 Next.js 網站...

使用 @next/mdxcontentlayer2(社區分支),MDX 與 App Router 本地集成。你的內容就是你的代碼庫。版本控制、分支、pull request 評論 -- 你已經知道的所有工作流。

MDX 何時崩潰

非開發者無法使用它。句號。如果你的行銷團隊需要發佈部落格文章,MDX 意味著他們要麼學習 Git,要麼你在為他們構建編輯界面(此時,只需使用 Payload)。

MDX 也不能很好地擴展到數千個頁面。在大約 500+ MDX 檔案,構建時間開始拖累,你的 IDE 變慢。對於公司部落格或文檔網站,它很完美。對於內容平台,它不是。

對於我們的Astro 開發工作,我們甚至更廣泛地使用 MDX,因為 Astro 的內容集合為 Markdown/MDX 內容提供了優秀的類型安全。

生產指標比較

這是來自我們實際生產部署和評估的數據:

CMS 生產頁面 語言 構建時間 月成本 我們的判決
Payload 3 228(SleepDr) 1 ~45s $35(Payload Cloud) Next.js 最佳 DX
Supabase 253K(DA+NAS+HostList) 30 ~10s $25(Pro 計畫) 規模最佳
Strapi 5 0(已評估) N/A N/A 免費(自託管) 最佳 GUI 編輯器
Sanity 0(已評估) N/A N/A ~$300-500 估計 協作最佳
Contentful 0(已評估) N/A N/A $300+(基本) 企業最佳
MDX ~60(此網站) 1 ~30s $0 開發者部落格最佳

構建時間列值得解釋。Payload 在 45 秒包括生成 228 個靜態頁面。Supabase 在 10 秒因為我們不靜態生成 253K 頁面 -- 我們使用動態渲染和 ISR。MDX 在 30 秒是約 60 篇文章,帶有語法突出顯示和圖像優化。

決策框架:如何選擇你的 CMS

忘記功能清單。回答這四個問題:

1. 誰在編輯內容?

  • 僅開發者 → MDX 或 Payload
  • 開發者 + 技術編輯 → Payload 或 Sanity
  • 非技術行銷團隊 → Strapi 或 Contentful

2. 有多少頁?

  • 不足 500 → 任何 CMS 都有效。根據編輯 UX 選擇。
  • 500-5,000 → Payload 或 Sanity。兩者都很好處理這個範圍。
  • 5,000-50,000 → Supabase 或 Contentful(預算充足)。
  • 50,000+ → Supabase。沒有其他東西在經濟上有意義。

3. 你的月 CMS 預算是多少?

  • $0 → 自託管 Payload、自託管 Strapi 或 MDX
  • $25-50 → Supabase Pro 或 Payload Cloud
  • $100-500 → Sanity Growth 或 Strapi Cloud
  • $500+ → Contentful 或 Sanity Enterprise

4. 你需要即時協作嗎?

  • 是的,關鍵 → Sanity(同類最佳)
  • 很高興有 → Payload(即時預覽很接近)
  • 不關心 → 任何其他

我們會做不同的事

後見之明是有價值的。以下是我們會改變的內容:

我們會更早開始使用 Payload。 在 Payload 3 成熟之前,我們構建了一些基於 Supabase 的自定義管理面板的早期項目。對於超過 5K 頁面的網站,Payload 會節省我們大量的管理 UI 開發時間。

我們會更早標準化我們的 Supabase-as-CMS 模式。 我們的三個 Supabase 項目中的每一個在內容建模、快取和重新驗證的約定上都略有不同。我們現在已經創建了一個內部模板,用於所有新的高流量項目。

我們會為非企業客戶跳過 Contentful 評估。 定價懸崖是真實的,兩次我們進行了多週的評估,只是意識到客戶的預算與 Contentful 的定價不符。我們應該首先詢問預算。

如果你面臨類似的 Next.js 項目 CMS 決策,我們很樂意分享更多關於我們體驗的詳細信息。查看我們的定價頁面直接聯繫 -- 我們每天都在做這些東西。

常見問答

2026 年 Next.js 的最佳無頭 CMS 是什麼? 基於我們在 253K+ 頁面上的生產體驗,Payload CMS 3 是 Next.js App Router 的最佳整體選擇。它的 Local API 消除了網絡開銷、TypeScript 類型自動生成,管理面板住在你的 Next.js 應用程序內。對於超過 10,000 頁的網站,我們推薦使用 Supabase 作為 CMS 層,帶有自定義管理界面。

Payload CMS 真的是免費的嗎? Payload CMS 是開源的,可免費自託管,沒有功能限制。你需要提供自己的託管和數據庫(MongoDB 或 PostgreSQL)。Payload Cloud 是他們的託管服務,2026 年起價約 $35/月用於生產工作負載。自託管版本上沒有按座位收費。

我能將 Supabase 用作 Next.js 的 CMS 嗎? 是的,我們在規模上做。我們運行三個生產網站,在 Supabase 上總共 253,000+ 頁。當你的內容是結構化數據(檔案、清單、產品目錄)而不是長篇社論內容時,它的效果特別好。主要權衡是你需要構建自己的內容編輯界面 -- Supabase 的表格編輯器不是為編輯工作流設計的。

Strapi 5 與 Payload CMS 3 對 Next.js 有何比較? Strapi 5 以其視覺化 Content-Type Builder 為非技術內容編輯提供了優秀的效果。Payload 3 以其 Local API 和 TypeScript 本地方法為開發者體驗提供了優秀的效果。如果你的編輯者是開發者,選擇 Payload。如果你的編輯者是行銷人員,選擇 Strapi。我們編寫了詳細的 Payload vs Strapi 比較,深入涵蓋了這個主題。

Next.js 最便宜的無頭 CMS 是什麼? 自託管 Payload CMS 和自託管 Strapi 都是真正免費的。Git 儲存庫中的 MDX 檔案除了你的託管之外沒有成本。對於託管服務,Supabase Pro 在 $25/月 提供最佳規模價值 -- 我們在單個 Pro 計畫上提供 253K 頁。Sanity 的免費層對於小項目也很慷慨(最多 3 個用戶,500K API 請求/月)。

Contentful 對 Next.js 項目值得嗎? Contentful 如果你是需要 99.99% SLA 的企業團隊、與 Commercetools 或 Salesforce 等工具建立的集成以及你有預算($300+/月用於基本,$3,000+/月用於 Premium),那麼它值得。對於初創公司和中型公司,Payload 或 Sanity 以相對成本的一小部分提供了可比較的功能。

我應該在 Next.js App Router 中使用 ISR 還是 SSR 帶著無頭 CMS? 這取決於你的頁面計數和內容更新頻率。對於超過 5,000 頁的網站,靜態生成帶著通過 webhooks 的按需重新驗證是理想的。對於 5,000+ 頁,動態渲染帶著 ISR(revalidate = 3600 或類似)更實用 -- 你無法在每個部署上構建 50K 頁。使用 Payload 的 Local API,區別變得較少重要,因為無論哪種方式都沒有網絡開銷。

我能從 WordPress 遷移到 Next.js 的無頭 CMS 嗎? 絕對可以。我們已經進行了多次 WordPress 遷移。典型的路徑是:通過 REST API 或 WP-CLI 導出 WordPress 內容、轉換並導入到你的目標 CMS,然後在 Next.js 中重建前端。Payload CMS 使這個過程特別順利,因為你可以建模你的集合以匹配現有的 WordPress 文章類型。有關此過程的更多詳細信息,請參見我們的無頭 CMS 開發解決方案