什麼是 Jamstack?行銷人員和工程師的架構指南
我已經為網站開發足夠長的時間,還記得「Jamstack」只是 Mathias 在 Smashing Conf 上做的一場演講。現在呢?Nike、Spotify 和 Twilio 都以這種方式運營他們網路業務的一部分。
以下是你需要了解的内容:Jamstack 不是一個框架。它是一種改變你如何構建、部署和提供網站的架構方法。它已經遠遠超越了「僅適用於博客」的階段。
本指南適用於雙方。工程師們:我們將深入探討 ISR 失效、邊界函數模式、真實構建配置。市場人員和產品人員:我們將展示為什麼這轉化為更快的頁面、更好的 SEO 排名、更少的凌晨 3 點故障。
目錄
- 核心概念:Jamstack 的真正含義
- 預渲染:構建一次,隨處提供
- CDN 傳遞:為什麼地理位置很重要
- API 解耦:後端成為一項服務
- 無頭 CMS:內容不需要龐然大物
- 邊界函數:CDN 層面的計算
- ISR:靜態與動態的最佳結合
- Jamstack 與傳統架構對比
- 真實生產示例
- 何時 Jamstack 不是最佳選擇
- 常見問題
核心概念:Jamstack 的真正含義
這個名稱代表 JavaScript、APIs 和 Markup。Mathias Biilmann(Netlify 共同創辦人)在 2015-2016 年左右創造了這個術語,因為沒有很好的縮寫來表達他的團隊一直在看到的模式。大寫的「JAM」已經被軟化為「Jamstack」——老實說,首字母縮寫詞不如兩個核心原則重要:
- 預渲染——盡可能提前生成你網站的大部分,而不是在每次請求時生成。
- 解耦——將你的前端與後端服務、資料庫和內容管理分離。
就是這樣。其他一切都源自這兩個概念。
為什麼市場人員應該關注
速度。運行時間。SEO。
Google 的核心網路指標直接影響搜尋排名。由 CDN 提供的預渲染頁面在 LCP(最大內容繪製)和 FID(首次輸入延遲)指標上的表現持續優於伺服器渲染頁面。Google 的 2025 Chrome UX Report 研究表明,使用靜態優先架構的網站通過核心網路指標閾值的比率幾乎是傳統伺服器渲染網站的兩倍。
翻譯:更快的頁面 → 更好的排名 → 更多流量。
為什麼工程師應該關注
降低操作複雜性。沒有原始伺服器需要在凌晨 2 點修補。沒有資料庫連接池需要調整。當你從配備 API 呼叫由受管服務處理的 CDN 提供靜態資產時,你的攻擊面急劇縮小。
你出貨速度更快,因為你的 CI/CD 管道是一個觸發構建並在幾分鐘內全球部署的 git push。
預渲染:構建一次,隨處提供
預渲染是基礎。Jamstack 網站不是在每次請求時由伺服器生成 HTML(WordPress/PHP 模式),而是在部署前的構建步驟期間生成所有 HTML 頁面。
簡化的概念模型:
傳統:用戶請求 → 伺服器 → 資料庫查詢 → 模板渲染 → HTML → 用戶
Jamstack: 構建步驟 → 靜態 HTML/CSS/JS → CDN → 用戶請求 → 即時響應
構建步驟在 CI/CD(Vercel、Netlify、GitHub Actions,無論什麼)中執行。它通過 API 從你的 CMS 拉取內容,通過你的框架構建過程運行,並輸出一個靜態文件夾。這些文件被推送到 CDN。
靜態網站生成(SSG)
原始 Jamstack 方法。每個頁面都在構建時生成。很好地處理這個問題的框架:
- Astro——默認情況下不發送 JavaScript。適合內容豐富的網站。我們在 Social Animal 為營銷網站廣泛使用它(查看我們的 Astro 工作)。
- Next.js——通過
getStaticProps和getStaticPaths支持 SSG,加上混合渲染模式。 - Hugo——在 Go 中構建速度極快。10,000 頁的網站在幾秒內構建。
- Eleventy (11ty)——最小化、靈活、沒有框架鎖定。
下面是 Next.js 中的 SSG:
// pages/blog/[slug].js
export async function getStaticPaths() {
const posts = await fetchAllPostSlugs(); // 來自無頭 CMS
return {
paths: posts.map((slug) => ({ params: { slug } })),
fallback: 'blocking', // ISR 回退——稍後會詳細說明
};
}
export async function getStaticProps({ params }) {
const post = await fetchPostBySlug(params.slug);
return {
props: { post },
revalidate: 60, // ISR:每 60 秒重新生成
};
}
Astro 中的類似方法:
---
// src/pages/blog/[slug].astro
import { getCollection } from 'astro:content';
export async function getStaticPaths() {
const posts = await getCollection('blog');
return posts.map((post) => ({
params: { slug: post.slug },
props: { post },
}));
}
const { post } = Astro.props;
---
<article>
<h1>{post.data.title}</h1>
<Content />
</article>
構建時間問題
SSG 有一個眾所周知的限制:構建時間與頁面數量成比例。50,000 頁的電子商務目錄可能需要 30 多分鐘才能構建。這在 2020-2022 年是一個真正的痛點。
業界的答案是什麼?ISR 和按需構建器(更多關於 ISR 部分)。
CDN 傳遞:為什麼地理位置很重要
CDN 在世界各地的邊界節點上緩存你的靜態文件。當東京的用戶請求你的頁面時,他們從東京邊界節點獲得——而不是從你在維吉尼亞州的原始伺服器。
性能差異很大。根據伺服器負載和用戶距離,典型的伺服器渲染頁面可能有 200-800ms 的 TTFB(首位元組時間)。一個由 CDN 提供的靜態頁面呢?通常是 10-50ms。
Jamstack 的 CDN 提供商
| 提供商 | 免費層 | 邊界位置 | 值得注意的特性 |
|---|---|---|---|
| Vercel | 100GB 頻寬/月 | 110+ | 為 Next.js 構建,自動邊界緩存 |
| Netlify | 100GB 頻寬/月 | 150+ | 部署預覽、表單處理、身份驗證 |
| Cloudflare Pages | 無限頻寬 | 330+ | Workers 集成、零冷啟動 |
| AWS CloudFront | 1TB/月(12 個月) | 450+ | 細粒度緩存控制、Lambda@Edge |
| Fastly | 按使用量 | 80+ | 即時清除、基於 VCL 的邊界邏輯 |
對於 2026 年的大多數 Jamstack 項目,Vercel 和 Netlify 在一個包中處理部署和 CDN。你推送代碼,他們構建和分發。如果你需要對緩存規則進行更多控制或者你在大規模運營,Cloudflare 或 Fastly 會為你提供這種粒度。
緩存失效
難的部分不是提供緩存的內容——而是知道何時清除那個緩存。當內容編輯發佈新博客文章時,它多快會上線?
使用純 SSG,你觸發完整重建。使用 ISR,你失效特定路徑。使用邊界函數,你可以按請求執行。每種方法都有新鮮度 vs. 構建複雜性的權衡。
API 解耦:後端成為一項服務
在傳統的 WordPress 或 Drupal 設置中,CMS 是伺服器。它存儲內容、呈現模板、處理身份驗證、處理表單並提供頁面。如果 CMS 出現故障,一切都會出現故障。
Jamstack 將所有這些分離。你的前端只是 CDN 上的文件。你的後端是一個 API 的集合——每個處理一個問題:
- 內容 → 無頭 CMS API(Sanity、Contentful、Storyblok)
- 身份驗證 → Auth0、Clerk、Supabase Auth
- 付款 → Stripe API
- 搜索 → Algolia、Meilisearch、Typesense
- 表單 → Formspree、Netlify Forms、Basin
- 電子商務 → Shopify Storefront API、Saleor、Medusa
這通常被稱為「可組合架構」。你為每個函數選擇最好的服務,而不是接受你的單一 CMS 捆綁的任何東西。
工程權衡
我不會假裝這一切都是好處。解耦引入了集成複雜性。你現在管理 API 密鑰、webhook 配置以及多個服務之間的資料流。龐然大物更容易理解。
當你需要大規模性能、不同團隊需要獨立工作或者你想要在不重寫整個網站的情況下交換服務時,權衡是值得的。
在 Social Animal,我們幫助團隊思考正是這種架構決策。我們的 無頭 CMS 開發工作是專門為找到每個項目的正確服務組合而構建的。
無頭 CMS:內容不需要龐然大物
無頭 CMS 存儲和管理內容,但對其顯示方式沒有任何意見。它通過 API 公開內容,而不是呈現頁面(就像 WordPress 所做的那樣)。你的前端在構建時、請求時或兩者都消費該 API。
無頭 CMS 比較(2026)
| CMS | 類型 | API 樣式 | 免費層 | 最適合 |
|---|---|---|---|---|
| Sanity | 基於 API | GROQ + GraphQL | 慷慨(免費到 200K API 請求/月) | 靈活的內容建模、實時協作 |
| Contentful | 基於 API | REST + GraphQL | 社區計畫(5 個用戶) | 企業團隊、本地化 |
| Storyblok | 基於 API | REST + GraphQL | 社區計畫(1 個用戶) | 視覺編輯、組件驅動的內容 |
| Strapi | 自託管/雲端 | REST + GraphQL | 免費(自託管) | 完全控制、自定義後端 |
| Payload CMS | 自託管 | REST + GraphQL | 免費(開源) | TypeScript 原生、程式碼優先配置 |
| WordPress(無頭) | 自託管 | REST + WPGraphQL | 免費(開源) | 具有現有 WordPress 專業知識的團隊 |
| Keystatic | 基於 Git | 文件系統 | 免費(開源) | 標記密集型網站、開發者主導的內容 |
選擇取決於你的團隊。如果你的編輯需要精美的視覺編輯體驗,Storyblok 或 Sanity 的 Studio 很難被擊敗。如果你想要內容存儲在你的 Git 存儲庫中作為標記文件,Keystatic 或甚至 Astro 的內置內容集合工作很好。
Jamstack 中的內容流
1. 編輯在無頭 CMS 中發佈內容
2. CMS 向構建平台(Vercel/Netlify)發送 webhook
3. 構建平台觸發新構建或 ISR 重新驗證
4. 框架通過 CMS API 取得最新內容
5. 靜態頁面被生成並部署到 CDN
6. 用戶看到更新的內容(秒到分鐘,取決於策略)
對於內容豐富的營銷網站,這個工作流是變革性的。編輯獲得專用的內容介面。開發人員完全控制前端。兩者都不會相互阻礙。
我們在我們的 Next.js 項目中一直看到這種模式。
邊界函數:CDN 層面的計算
邊界函數是自 ISR 以來 Jamstack 最大的演進。它們讓你在 CDN 邊界節點運行小段伺服器端程式碼——靠近用戶,冷啟動時間以單位數毫秒計。
將它們視為在響應到達用戶之前執行的輕量級無伺服器函數。它們非常適合:
- A/B 測試——將用戶路由到不同的頁面變體,無需客戶端閃爍
- 個性化——根據地理位置、cookie 或標題提供不同的內容
- 身份驗證檢查——在提供受保護的內容之前驗證 JWT 令牌
- URL 重寫和重定向——在邊界處理複雜的路由邏輯
- 功能標誌——切換功能而無需重新部署
邊界函數示例(Vercel)
// middleware.ts(在邊界上對每個請求執行)
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
export function middleware(request: NextRequest) {
const country = request.geo?.country || 'US';
// 將歐盟用戶重定向到符合 GDPR 的版本
if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(country)) {
return NextResponse.rewrite(new URL(`/eu${request.nextUrl.pathname}`, request.url));
}
// A/B 測試:基於 cookie 的 50/50 分割
const bucket = request.cookies.get('ab-bucket')?.value;
if (!bucket) {
const response = NextResponse.next();
response.cookies.set('ab-bucket', Math.random() > 0.5 ? 'a' : 'b');
return response;
}
return NextResponse.next();
}
export const config = {
matcher: ['/((?!api|_next/static|favicon.ico).*)'],
};
邊界函數提供商
- Vercel Edge Middleware——在每個路由之前執行,緊密的 Next.js 集成
- Netlify Edge Functions——基於 Deno,在 Deno Deploy 的網路上執行
- Cloudflare Workers——最大的邊界網路、V8 隔離、無冷啟動
- Deno Deploy——全球部署,零配置,基於 Deno 執行時
邊界函數模糊了靜態和動態之間的界線。你獲得 CDN 傳遞的延遲優勢,只需足夠的伺服器端邏輯來處理個性化。
這是 2026 年 Jamstack 真正閃耀的地方——它不再是「只是靜態網站」了。
ISR:靜態與動態的最佳結合
我們在 2020 年努力應對了這個問題。客戶有一個 50,000 頁的電子商務目錄。完整重建需要 30 多分鐘。內容編輯將發佈更新並等待。再等等。
增量靜態再生(ISR)解決了它。Next.js 在 2020 年引入了它。頁面在構建時靜態生成,但可以在指定時間間隔之後或通過 API 呼叫在後台重新生成。
ISR 如何運作
- 第一個請求命中 CDN 並提供緩存的靜態頁面
- 如果頁面早於
revalidate間隔,Next.js 觸發後台重新生成 - 下一個請求獲取新生成的頁面
- 用戶永遠看不到加載狀態——他們總是獲得緩存的版本
// Next.js ISR 與按需重新驗證
// pages/api/revalidate.js
export default async function handler(req, res) {
// 驗證來自 CMS 的 webhook 秘密
if (req.query.secret !== process.env.REVALIDATION_SECRET) {
return res.status(401).json({ message: '無效的令牌' });
}
try {
const { slug } = req.body;
await res.revalidate(`/blog/${slug}`);
return res.json({ revalidated: true });
} catch (err) {
return res.status(500).send('重新驗證時出錯');
}
}
這意味著內容編輯在 Sanity 中發佈變更,webhook 觸發到你的重新驗證端點,只有那個特定的頁面被重新生成。你的其他 50,000 頁網站保持不變。
構建時間從 30 分鐘降至毫秒的內容更新。
ISR 對比 SSG 對比 SSR
| 策略 | 何時生成 HTML | 新鮮度 | 性能 | 最適合 |
|---|---|---|---|---|
| SSG | 構建時只 | 陳舊直到下一次構建 | 最快(純 CDN) | 變化不頻繁的網站 |
| ISR | 構建時 + 後台重新生成 | 秒到分鐘陳舊 | 快(CDN 帶後台更新) | 定期更新的內容網站 |
| SSR | 每個請求 | 總是新鮮 | 較慢(伺服器依賴) | 高度動態、個性化的頁面 |
| 邊界 SSR | 邊界上的每個請求 | 總是新鮮 | 快(邊界計算) | 動態 + 低延遲 |
實際上,2026 年大多數生產 Jamstack 網站使用混合方法。營銷頁面是 SSG。博客文章使用 60 秒重新驗證的 ISR。儀表板頁面使用 SSR 或客戶端渲染。
Next.js 和 Astro 都支持這種每路由渲染策略。
Jamstack 與傳統架構對比
| 方面 | 傳統(WordPress/Drupal) | Jamstack |
|---|---|---|
| 呈現 | 伺服器端、每個請求 | 預渲染 + CDN 緩存 |
| 託管 | 需要網路伺服器 + 資料庫 | CDN 上的靜態文件 |
| 擴展 | 垂直(更大的伺服器)或緩存層 | 水平默認(CDN 處理) |
| 安全 | 大的攻擊面(伺服器、資料庫、外掛) | 最小化(靜態文件、API 密鑰伺服器端) |
| TTFB | 典型 200-800ms | 典型 10-50ms |
| 內容編輯 | 內置 CMS 介面 | 單獨的無頭 CMS |
| 部署 | FTP/SSH、伺服器重啟 | Git push → 自動構建 + 部署 |
| 大規模成本 | 隨著流量增加(伺服器資源) | 通常平坦或最小化(CDN 頻寬) |
| 開發者體驗 | 與 CMS 範本語言相關聯 | 任何前端框架 |
我想在這裡誠實:傳統架構並不差。WordPress 為超過 40% 的網路提供支持,原因很充分——它成熟、廣為人知,並且擁有龐大的生態系統。
當性能很關鍵、你需要不可預測地擴展時,或者當你的開發團隊想要使用現代前端工具時,Jamstack 方法會獲勝。
真實生產示例
讓我分享一些具體的例子——不是假設情景,而是實際的生產架構。
示例 1:電子商務產品目錄
堆棧: Next.js + Shopify Storefront API + Sanity(適用於編輯內容)+ Vercel
我們合作的一個直銷時尚品牌有大約 8,000 個產品頁面。使用 5 分鐘重新驗證的 ISR,產品頁面保持新鮮,無需完整重建。編輯內容(風格指南、造型指南)位於 Sanity 中。Shopify 處理庫存和結帳。
結果:從他們的 Shopify Liquid 主題遷移後,平均 TTFB 從 680ms 下降到 35ms。
示例 2:多品牌營銷網站
堆棧: Astro + Storyblok + Cloudflare Pages
一家 SaaS 公司在一個域下運營四個產品品牌。每個品牌都有不同的視覺設計,但共享導航和頁腳組件。Astro 的島嶼架構意味著大多數頁面在沒有客戶端 JavaScript 的情況下運送。Storyblok 的視覺編輯器讓營銷團隊重新排列頁面部分,無需開發人員參與。
整個 400 頁網站的構建時間:大約 45 秒。
示例 3:文件門戶
堆棧: Next.js App Router + Git 中的 MDX 內容 + Algolia 搜索 + Vercel
一家開發者工具公司擁有 2,000 多份文件頁面。內容作為 MDX 文件存在在存儲庫中——無需外部 CMS。Algolia 在構建時索引內容以實現即時搜索。ISR 處理少數動態頁面(更新日誌、狀態)。
該團隊使用 Vercel 的預覽部署,以便技術撰寫人員在合併前查看文件變更。
示例 4:新聞/媒體網站
堆棧: Next.js + Contentful + Fastly CDN + AWS Lambda
一家數字媒體發行商需要子秒級頁面加載以實現 SEO 和廣告收入優化。突發新聞頁面使用由 Contentful webhook 觸發的按需 ISR——新文章在發佈後 10 秒內上線。邊界函數處理地理目標廣告插入。
他們的核心網路指標通過率在遷移後從 45% 增加到 92%。
何時 Jamstack 不是最佳選擇
我相信直言不諱地說明限制。Jamstack 不適合:
- 高度互動的實時應用(想想 Google Docs、Figma)——這些需要持久的伺服器連接,而不是預渲染的頁面。
- 每個用戶的每個頁面都是唯一的網站——如果沒有任何東西可以被緩存,你會失去 CDN 優勢。雖然邊界 SSR 有幫助橋接這個差距。
- 沒有前端工程能力的團隊——如果你有舒適使用 React/Vue/Svelte 和 API 集成的開發人員,DX 很好。一個獨唱營銷人員通常最好用 Squarespace 或 WordPress 服務。
- 快速原型設計,其中架構還不重要——如果你在下週驗證一個想法,不要過度設計堆棧。
如果你不確定 Jamstack 是否適合你的項目,我們很樂意討論權衡。聯絡我們或查看我們的 無頭網路項目定價。
常見問題
Jamstack 僅適用於靜態網站嗎?
不是——這是最常見的誤解。雖然 Jamstack 起源於靜態網站,但現代 Jamstack 包括 ISR、邊界函數和邊界的伺服器端呈現。你可以構建完全動態、個性化的體驗。
「靜態」部分是指頁面如何被提供(來自 CDN 的預建文件),而不是它們能做什麼。
Jamstack 如何處理動態內容(如用戶評論或購物車)?
通過客戶端 JavaScript 和 API。評論可能使用 Disqus 之類的服務或自定義 API 端點。購物車通常使用與電子商務 API 同步的客戶端狀態(Shopify、Snipcart、Medusa)。
靜態頁面會立即加載,然後 JavaScript 融合動態部分。
無頭 CMS 與傳統 CMS 有什麼區別?
傳統 CMS(如默認模式下的 WordPress)管理內容和呈現前端。無頭 CMS 只管理內容並通過 API 傳遞它。
你的前端——使用 Next.js、Astro 或任何框架構建——消費該 API。這種解耦讓你在網站、行動應用和其他頻道中使用相同的內容。
Jamstack 網站的託管成本是多少?
對於大多數網站,明顯少於傳統託管。Vercel、Netlify 和 Cloudflare Pages 都有可以處理適度流量的慷慨免費層。
即使在規模上,你也是為 CDN 頻寬(便宜)而付款,而不是伺服器計算(昂貴)。獲得 500K 月度訪客的網站在 Vercel 的 Pro 計劃上可能花費 $0-$20/月。相同流量的受管 WordPress 主機可能成本 $50-$300/月。
Jamstack 對 SEO 有效嗎?
非常有效。搜尋引擎在第一次請求時接收完全呈現的 HTML——無需等待 JavaScript 執行。頁面速度改進直接影響核心網路指標分數。
預渲染的元標籤和結構化資料在構建時被烤進 HTML。許多 SEO 專業人員專門推薦為內容網站提供 Jamstack 架構。
如果我的無頭 CMS 出現故障會發生什麼?
這實際上是 Jamstack 的優勢之一。因為你的網站是預渲染的並從 CDN 提供,即使你的 CMS 暫時不可用,它也會保持在線。
編輯無法在中斷期間發佈新內容,但你的網站繼續向所有訪客提供最後構建的版本。將此與傳統 WordPress 進行比較,其中資料庫中斷意味著你的整個網站出現故障。
將 WordPress 網站遷移到 Jamstack 需要多長時間?
這取決於複雜性。一個有 50-100 頁的簡單營銷網站可能需要 4-8 週。一個擁有數千篇文章、自定義外掛和複雜工作流的大型內容網站可能需要 3-6 個月。
內容遷移本身(WordPress 到無頭 CMS)通常是最簡單的部分——wp-graphql 之類的工具和 CMS 特定的導入器處理繁重工作。前端重建是大部分時間的去向。
非技術人員可以在 Jamstack 網站上管理內容嗎?
絕對可以。這就是無頭 CMS 的全部要點。
Storyblok 之類的平台提供拖放視覺編輯。Sanity 的 Studio 提供可自定義的編輯介面。從編輯的角度來看,體驗通常更好,因為 CMS 專門為內容管理而構建,沒有主題設置、外掛配置和伺服器管理的混亂。