我从事网络开发已经很久了,还记得"Jamstack"只是 Mathias 在 Smashing Conf 上的一次会议演讲。现在呢?Nike、Spotify 和 Twilio 都用这种方式运行他们网站的部分内容。

以下是你需要了解的内容:Jamstack 不是一个框架。它是一种改变你如何构建、部署和提供网站服务的架构方法。它已经成熟得远超"仅用于博客"的阶段。

本指南适用于两方。工程师们:我们将深入探讨 ISR 失效、边缘函数模式、真实的构建配置。营销人员和产品经理:我们将展示为什么这转化为更快的页面、更好的 SEO 排名、更少的凌晨 3 点宕机。

目录

核心思想:Jamstack 实际上是什么意思

这个名字代表 JavaScript、APIs 和 Markup。Mathias Biilmann(Netlify 联合创始人)大约在 2015-2016 年创造了这个术语,因为当时没有很好的速记方式来描述他的团队一直看到的这种模式。大写的"JAM"已经被软化为"Jamstack"——老实说,这个首字母缩略词不如两个核心原则重要:

  1. 预渲染 -- 尽可能多地在提前生成网站内容,而不是在每个请求时生成。
  2. 解耦 -- 将你的前端与后端服务、数据库和内容管理分离。

就这样。其他一切都源于这两个想法。

为什么营销人员应该关注

速度。正常运行时间。SEO。

Google 的核心网页指标直接影响搜索排名。从 CDN 提供的预渲染页面在 LCP(最大内容绘制)和 FID(首次输入延迟)指标上的表现一致地优于服务器渲染页面。Google Chrome UX Report 的 2025 年研究表明,使用静态优先架构的网站通过核心网页指标阈值的速率是传统服务器渲染网站的近两倍。

翻译:更快的页面 → 更好的排名 → 更多流量。

为什么工程师应该关注

降低运营复杂性。没有凌晨 2 点需要修补的原点服务器。没有需要调优的数据库连接池。当你从具有由托管服务处理的 API 调用的 CDN 提供静态资产时,你的攻击面会大幅缩小。

你部署得更快,因为你的 CI/CD 管道是一个 git push,触发构建并在几分钟内全球部署。

预渲染:构建一次,处处服务

预渲染是基础。不是服务器在每个请求时生成 HTML(WordPress/PHP 模型),而是 Jamstack 网站在部署前的构建步骤中生成所有 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 -- 通过 getStaticPropsgetStaticPaths 支持 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,你失效特定路径。使用边缘函数,你可以每个请求做一次。每种方法都有新鲜度与构建复杂性的权衡。

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 存储和管理内容,但对如何显示没有意见。它不是渲染页面(就像 WordPress 所做的那样),而是通过 API 公开内容。你的前端在构建时、请求时或两者都消费该 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 很难被击败。如果你想将内容作为 markdown 文件存储在 Git 仓库中,Keystatic 甚至 Astro 的内置内容集合都效果很好。

Jamstack 中的内容流程

1. 编辑在无头 CMS 中发布内容
2. CMS 向构建平台发送 webhook(Vercel/Netlify)
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 交付的延迟优势,只需足够的服务器端逻辑来处理个性化。

这是 Jamstack 在 2026 年真正闪耀的地方 -- 它不再只是"静态网站"了。

ISR:静态和动态的最佳结合

我们在 2020 年应对了这个问题。客户有一个 50,000 页的电子商务目录。完整重建耗时 30 多分钟。内容编辑会发布更新并等待。一直等待。

增量静态再生(ISR)解决了它。Next.js 在 2020 年推出了它。页面在构建时进行静态生成,但之后可以在指定的时间间隔后或通过 API 调用在后台重新生成

ISR 如何工作

  1. 首次请求击中 CDN 并提供缓存的静态页面
  2. 如果页面早于 revalidate 间隔,Next.js 触发后台再生
  3. 下一个请求获得新生成的页面
  4. 用户从不看到加载状态 -- 他们总是获得缓存版本
// 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: 'Invalid token' });
  }

  try {
    const { slug } = req.body;
    await res.revalidate(`/blog/${slug}`);
    return res.json({ revalidated: true });
  } catch (err) {
    return res.status(500).send('Error revalidating');
  }
}

这意味着内容编辑在 Sanity 中发布更改,webhook 触发到你的重新验证端点,只有那个特定页面被重新生成。你的 50,000 页网站的其余部分保持不变。

构建时间从 30 分钟降至内容更新的毫秒。

ISR vs SSG vs SSR

策略 何时生成 HTML 新鲜度 性能 最适合
SSG 仅构建时 陈旧直到下一次构建 最快的(纯 CDN) 不经常更改的网站
ISR 构建时 + 后台再生 秒到分钟陈旧 快速的(CDN 加后台更新) 定期更新的内容网站
SSR 每个请求 总是新的 更慢的(服务器依赖) 高度动态、个性化的页面
Edge SSR 边缘处的每个请求 总是新的 快速的(边缘计算) 动态 + 低延迟

在实践中,2026 年大多数生产 Jamstack 网站使用混合方法。营销页面是 SSG。博客文章使用 ISR 与 60 秒重新验证。仪表板页面使用 SSR 或客户端渲染。

Next.js 和 Astro 都支持这种每路由渲染策略。

Jamstack 与传统架构

方面 传统(WordPress/Drupal) Jamstack
渲染 服务器端、每个请求 预渲染 + CDN 缓存
托管 需要网络服务器 + 数据库 CDN 上的静态文件
扩展 垂直的(更大的服务器)或缓存层 默认水平的(CDN 处理)
安全 大的攻击面(服务器、DB、插件) 最小的(静态文件、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

我们合作的一个 DTC 时尚品牌有约 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 webhooks 触发的按需 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 提供可自定义的编辑界面。从编辑的角度来看,体验通常优于 WordPress,因为 CMS 是为内容管理而专门构建的,而没有主题设置、插件配置和服务器管理的混乱。