Payload CMS 与 Strapi:如何选择适合你的 Headless CMS

我在 Strapi CMS 上搭内容系统已经很多年了。但 2025 年 6 月 Figma 收购 Payload CMS 之后,我开始注意到它。接下来两个月里,我选用了 Payload CMS 来给一个基于 Next.js 的前端搭建内容系统。

这篇文章就是基于这两段实际使用经历,从功能、定制能力和定价方案几个方面,对比 Payload CMS v3 和 Strapi v5。

声明:我和 Payload 或 Strapi 的开发团队都没有任何关系。

如果你只想看结论,可以直接看下面这张表:

如果你想要选它
  • 能深度用代码定制的 Admin UI
  • 用代码定义 schema 和访问权限,并且有强类型保障
  • 灵活的托管方式,包括 Vercel、Cloudflare 这类对 Next.js 友好的平台
Payload CMS
  • 开箱即用、打磨完善的编辑器友好型 Admin UI
  • 内容团队不需要开发介入或写初始代码,就能调整权限
  • 托管云服务,把 CMS、数据库和多环境维护都包掉
Strapi

1. 核心区别

Payload CMS 和 Strapi 想解决的问题,本质上就不一样。理解这个理念上的差异,能帮你更清楚地看到各自的强项和短板,从而选到真正适合自己需求的那个。

1.1. 开发者优先的框架 vs 编辑器友好的平台

Payload 的定位,是给开发者用来构建自己的内容系统或后端应用的框架,而不是一个开箱即用的、打磨好的 GUI 内容工具。数据模型和访问控制都必须用代码写。它的 Admin UI 只是一个默认前端,任何字段、视图或布局组件都能轻松用开发者自己的 React UI 代码覆盖。

Strapi 则更像一个传统的 headless CMS。它的管理面板允许内容编辑通过 Admin UI 定义 schema、创建组件、管理角色、设置权限。Strapi 的 Admin UI 也打磨得更精致,并且设计上并不鼓励你去覆盖它。它可以通过插件扩展,但整体上追求的是一个成品体验,而不是一个框架层。

1.2. 与 Next.js 集成的后端 vs 独立 headless CMS

Payload 安装在 Next.js 项目的 /app 目录里。也就是说,你的 Payload CMS 项目本身就是一个 Next.js 项目。因此,Payload CMS 可以部署在任何能托管 Next.js 项目的地方(Vercel、Cloudflare 等)。而且,对于基于 Next.js 的前端,CMS 和前端可以跑在同一个 Next.js 实例里。

Strapi 则是一个独立的 headless CMS,前端基于 React,后端基于 Node。它通过 REST API 或 GraphQL 把内容暴露给前端,部署方式跟传统的 Node 后端一样。

Payload 通过和 Next.js 的紧密集成、以及可组合的后端框架,给开发者很大的发挥空间;而 Strapi 通过打磨完善的管理界面,让内容编辑几乎不用技术团队插手,就能管理 schema 和权限。

2. 内容管理功能对比

搞清楚两者在根本方向上的差异之后,接下来对比它们在内容管理方面的具体功能:

2.1. 内容版本管理 Payload CMS ✅

对内容团队来说,能查看、对比和恢复某条记录的历史版本,往往是很关键的功能。在多个编辑协作处理内容的情况下,这一点尤其重要。

Payload CMS 和 Strapi 都支持保留记录的内容版本。但 Strapi 的内容版本功能(叫 Content History)有两个限制:

  • 不会高亮显示两个版本之间的差异。
  • Free 方案不可用。

相比之下,Payload CMS 的免费版就带内容版本功能,并且能高亮显示任意两个版本之间的改动。

Payload CMS v3(v3.59.1)的内容版本功能
Payload CMS 会高亮显示一条记录任意两个版本之间的改动
Strapi v5(v5.23.3)的内容版本功能
Strapi(付费方案)支持内容历史,但不会高亮显示两个版本之间的差异

两者都支持版本历史,但 Payload 所有方案都提供,并且能显示两个版本的可视化差异;Strapi 则把版本功能限制在付费方案里,也没有并排对比高亮。

2.2. 媒体上传 Payload CMS ✅

Payload 和 Strapi 都支持把媒体资源上传到各种存储服务(本地、AWS S3、Backblaze B2 等),也允许编写自定义上传 provider,来控制文件怎么存、存到哪。

Strapi 通过核心的 Media Library 插件处理上传。这个插件界面打磨得不错,还有 Folders 这种组织资源的功能。但如果想扩展媒体文件的 schema(比如给媒体项加自定义元数据字段),就得用一些变通办法,或者非平凡地覆盖插件 UI。

Payload 允许任何 collection 变成媒体上传相关的 collection(在那个 collection 的配置里指定 upload 配置即可)。这带来两个根本性的好处:

  • 我们可以让媒体 collection 带任何需要的元数据字段,比如 altText、title、artist 或 copyrightInfo。
  • 可以按需用不同的媒体 collection 来组织媒体资源,各自配不同的 schema、provider、上传规则等(比如文档、图片、视频分别用不同 upload 配置的 collection)。

在上传能力和 provider 灵活性上,Strapi 和 Payload CMS 不分伯仲。但如果你需要给上传内容存自定义元数据,Payload 的 schema 驱动方式会更有优势。

2.3. 组件 / Group Fields Payload CMS ✅ Strapi ✅

Strapi 的组件或 Payload 的 group fields,都允许创建由多个字段组成的可复用字段结构,并在多个 collection 之间使用。比如一个 BlogPostAuthor 结构可以包含 ProfilePicture、Name 和 Bio 这几个字段,然后在 BlogPost 和 Article collection 里复用。

虽然两者都支持这个功能,但实现方式不同。Strapi 允许在 Admin UI 里定义和使用组件。Payload CMS 则要求 group fields 用 TypeScript 代码定义。这给开发者带来更强的类型安全,也能定义这些 group 在 Admin UI 里怎么显示、怎么行为。

两个平台也都支持嵌套结构(一个组件或 group field 里可以再包含另一个组件或 group field)。

Strapi 让编辑可以通过 UI 构建可复用组件,而 Payload 更看重强类型安全和开发者通过代码获得的灵活性。

2.4. Dynamic Zone / Blocks Field Payload CMS ✅ Strapi ✅

Dynamic zone 或 Blocks field 允许 collection 里有一个字段类型,可以包含差异很大的多种数据类型。比如 Webpage collection 可以有个 Body 字段,里面能放零个或多个 Image、Paragraph、Separator、Table、TwoColumnParagraph 等区块。这让内容团队能从一个 collection 构建出各种不同的网页,内容编辑既灵活又强大。

同样,Payload CMS 和 Strapi 对这个功能的支持都很扎实。区别在于方式:内容编辑可以通过 Strapi Admin UI 定义 Dynamic zone,而开发者可以在 Payload CMS 项目里定义 Blocks field。

在构建动态结构、让内容编辑更灵活强大这一点上,Strapi 和 Payload CMS 势均力敌。

2.5. 实时预览 Payload CMS ✅

内容编辑都希望能即时预览自己往 CMS 里填的内容输出效果。更顺畅的预览机制意味着更快的反馈循环,能省下不少时间。

Strapi 的 Live Preview 功能在 Free 方案里没有(只有 Growth 或更高方案才有)。相比之下,Payload CMS 的 Free 方案就包含预览。另外,Payload CMS 的预览比 Strapi CMS 更加即时(见下面的录屏)。

Strapi v5(v5.23.3)的内容预览
用 Strapi v5 预览内容变化需要刷新页面
Payload v3(v3.59.1)的内容预览
用 Payload v3 预览内容变化会自动刷新

2.6. 内容翻译管理 Payload CMS ✅ Strapi ✅

Strapi 和 Payload CMS 都具备管理同一条记录多语言版本的能力。但它们的实现方式差异很大,也带来了明显的下游区别。

Strapi 通过核心插件 @strapi/plugin-i18n 支持多语言。这个插件给每个条目加一个 locale 字段,每条本地化记录都作为独立的数据库行存储。相比之下,Payload 把本地化原生集成进了 schema 系统。本地化是在字段级别配置的(不是 collection 级别),在字段定义里指定 localized: true 即可。Payload 不是把翻译存成独立记录,而是存在同一行里(比如 { greetings: { en: 'Hello', fr: 'Bonjour' } })。

Strapi 的方式更适合翻译由不同人或不同团队负责的场景。Payload 的方式则更适合只需要本地化少数几个字段、其余字段在各语言间共享的需求,也适合所有语言版本都并排维护的编辑。

两者都支持多语言内容,但方式不同。Strapi 按语言存独立记录,适合不同人分别管理翻译的场景。Payload 在单条记录里本地化字段,更适合所有语言版本并排管理的编辑。

Strapi v5(v5.23.3)的内容翻译管理
Strapi 为每种语言维护独立记录
Payload v3(v3.59.1)的内容翻译管理
Payload 本地化特定字段,其余字段在各语言间共享

2.7. 用户管理 Strapi ✅

一个 CMS 通常要管理两类用户:一类是访问 Admin UI 管理内容的人,另一类是登录前端或应用、使用用户专属功能的人。

Strapi 内置了对这两类用户的支持。它开箱即用地提供了独立的管理员用户和应用用户体系,也允许给应用用户加自定义字段,用极简配置做服务端认证定制。

Payload 允许我们把任何 collection 通过指定 auth: true 变成用户 collection。所以我们可以创建 admin 和 customer 这样的 collection,并通过 Payload 配置对象限制 admin 用户的 Admin UI 访问。但给非管理员和管理员设置不同 access 需要初始的编码工作。相比之下,Strapi 可以直接在 Admin UI 里设置。

两者在用户管理能力上差不多。但 Strapi 内置的管理员和用户体系让搭建更快,Payload 则需要在代码里显式写访问规则。

2.8. 基于角色的 API 访问 Strapi ✅

Payload CMS 和 Strapi 都支持定义角色、设置基于角色的 API 访问权限。两者也都允许在代码里实现更细粒度的逻辑,比如只有请求带有效优惠码时,才返回 product_type 为 premium 的行。

在 Payload 里,访问控制完全在代码里定义,可以在 collection 或字段级别:

// 用 Payload CMS 定义字段级访问权限
{
  name: 'editorNotes',
  type: 'textarea',
  access: {
    read: ({ req }) => !!req.user && req.user.role === 'editor',
    update: ({ req }) => !!req.user && req.user.role === 'editor',
  },
}

相比之下,Strapi 允许通过 Admin UI 定义基于角色的 API 访问,更细粒度的限制可以在代码里实现。

Strapi v5 的基于角色的访问控制
Strapi 可以通过 Admin UI 做访问控制

Payload 的纯代码模型给了开发者完全的控制权,但也意味着改访问规则需要开发者介入。或者,要构建动态 RBAC 系统,需要大量初始编码。相比之下,Strapi 的混合模型——常见情况用 UI,特殊情况用代码——更灵活,既适合内容团队也适合开发者。

两者都提供基于角色的 API 访问,但 Strapi 的 Admin UI 让内容团队能独立调整权限,减少对开发者的依赖,迭代更快。Payload 要实现类似能力,需要大量前期开发。

3. 定制能力对比

可定制的 CMS 能带来灵活性,让你围绕具体的编辑需求、审批流程和集成要求来塑造它。下面从这几个方面对比 Payload CMS 和 Strapi:

3.1. 定制 Admin UI Payload CMS ✅

定制 Admin UI,指的是扩展或覆盖默认 UI,改变它的外观或行为。

Strapi 允许通过插件和扩展来扩展 Admin UI。但要完全覆盖默认 UI,需要用自定义代码重新构建 Strapi 包。这很复杂,也难以维护。

Payload 则从设计上就考虑到了定制。它的 Admin UI 就是为了被覆盖而构建的,开发者可以通过代码控制任何字段或 collection 的显示和行为。它也支持通过插件扩展管理能力。

Strapi 的 Admin 通过插件容易扩展,但内置 UI 很难覆盖。Payload 的 Admin 从设计上就可定制,深度改 UI 更简单,也更好维护。

3.2. 定制 API Payload CMS ✅ Strapi ✅

定制 API,指的是覆盖默认 CRUD API 的行为,以及定义自定义 API 端点。

Payload 和 Strapi 都允许:

  • 通过 Strapi 的 policy 或 Payload 的 access 函数设置基于代码的访问控制。
  • 利用 Strapi 的 middleware 或 Payload 的 lifecycle hook 修改请求过滤条件或响应数据对象。
  • 当上述方式不够用时,编写 Koa(Strapi)或 Express(Payload)中间件。
  • 编写带自定义业务逻辑的自定义 API 路由,扩展 API 能力。

Payload CMS 和 Strapi 都允许覆盖默认 CRUD API 行为,也都能定义自定义 API 端点。

3.3. 与其他系统集成 Payload CMS ✅ Strapi ✅

CMS 常常需要把数据推送到其他系统(比如搜索索引或 Zapier),或者从外部来源(比如 IoT 传感器)接收数据。

Strapi 有针对 API 的 middleware、自定义 API 路由和 webhook 来支持集成。用 Payload CMS 的话,类似的集成可以通过 lifecycle hook 和 collection 专属的自定义 API 端点来搭建。

通过 lifecycle hook、自定义 API 端点和中间件,Payload CMS 和 Strapi 都能让 CMS 和其他系统集成。

3.4. 前端集成 Payload CMS ✅

一个内容系统由消费 CMS 数据的前端或应用组成。两者之间强集成能保证更快的开发、更简单的内容工作流和更容易的维护。

Strapi 是一个传统的基于 Node 的 headless CMS,通过 REST 或 GraphQL API 与前端集成。它也支持预览草稿内容和触发前端缓存失效。

Payload CMS 提供所有这些能力,并且和 Next.js 前端搭配时还有额外好处:

  • 前端可以像普通函数一样调用 CMS API(比如 payload.find()),作为进程内 API 调用执行。这样写代码更简单,运行也更快(仅当 Next.js 前端跑在同一个 Node 进程里时)。
  • CMS 的 TypeScript 类型自动在前端代码里可用(仅限使用 Next.js 的 monorepo 项目)。

Strapi 和 Payload 都能和前端顺畅集成,但 Payload 原生的 Next.js 基础,在搭配 Next.js 前端时能带来额外好处。

4. 其他方面对比

除了内容功能和定制能力,选择 CMS 框架时还有一些因素要考虑。下面逐一评估:

4.1. 流行度和生态成熟度 Strapi ✅

评估 CMS 框架时,流行度很重要。它意味着更强的社区支持、更多第三方插件、更成熟的生态和更少的边缘问题。

npm 包下载量

截至 2025 年 10 月,Payload 和 Strapi 的 npm 下载量不相上下。但过去六个月里,Payload 呈现出更强的上升趋势,说明接下来几个月还会保持势头。

Payload CMS 与 Strapi 过去 5 年的下载量对比
Payload CMS 与 Strapi 过去 5 年的下载量对比

GitHub stars

截至 2025 年 10 月,@strapi/strapi 仓库有 7 万 stars,而 payloadcms/payload 仓库有 3.8 万,主要是因为 Strapi 起步比 Payload CMS 早很多。

Payload CMS 与 Strapi 的 GitHub star 历史
Payload CMS 与 Strapi 的 GitHub star 历史

社区插件

Strapi 的插件生态更强,市场里大约有 350 个插件,而 Payload CMS 有 130 个社区插件。

总体来看,Strapi 仍然是更流行的 CMS,主要因为它存在时间更长、生态更成熟。但 Payload 加速增长的 adoption 曲线说明,它可能很快成为主流选择。

截至 2025 年 10 月,Strapi 看起来更流行,社区生态也更广。但 Payload 的快速增长趋势说明它的采用曲线在上升,未来可能更受欢迎。

4.2. 托管选项 Payload CMS ✅ Strapi ✅

Strapi 可以自托管在任何支持 Node.js 后端的平台上,包括 Render、Railway 这类托管服务商,以及 AWS EC2、Hetzner 这类 VPS。它也提供 Strapi Cloud(商业用途只有付费方案),一个托管方案,负责 CMS、数据库、媒体存储以及 dev、staging、production 等多环境。

Payload 则没有自己的托管云,必须自托管,这意味着团队要自己管理独立的存储和数据库托管,以及部署环境。不过 Payload 的自托管选项很丰富:

  • 除了 Node.js 兼容平台,Payload 还能托管在 Vercel、Netlify、Cloudflare 这类前端托管平台,这些平台有慷慨的免费额度。
  • Payload 团队提供 starter template,方便在 Vercel 和 Cloudflare 上快速部署。
  • 当前端基于 Next.js 时,Payload 和前端可以托管在同一个实例里,降低基础设施复杂度。

Payload 的自托管灵活性让它很适合想要控制权和低成本部署方案的团队。Strapi 则同时提供托管云和自托管,更适合想完全把托管、数据库和 CMS 环境都外包出去的团队。

4.3. 定价方案 Payload CMS ✅ Strapi ✅

Payload 的免费方案开箱即用,功能更完整。它包含内容版本和实时预览这类高级内容功能,而 Strapi 的免费版没有这些。

另一方面,Strapi 的 Growth 方案定价远低于企业级,包含单点登录(SSO)和基于 AI 的内容建模等功能。相比之下,Payload 要从免费方案直接跳到企业级才能用 SSO 和 AI 功能。

Payload 的免费方案免费提供更多功能,而 Strapi 定价合理的付费档让 SSO 这类高级功能更容易获得,不用直接跳到企业级价格。

5. 结论

基于上面的对比,不同的优先级会把团队导向不同的 headless CMS。下面这个简洁的总结可以帮你做决定:

如果你是那么
以开发者为主、看重灵活性的团队Payload 基于代码、Next.js 原生的方式,让你能直接用 TypeScript 塑造一切。
以内容为主、希望初始编码工作最少的团队Strapi 打磨完善的 Admin UI 和成熟的插件生态,让你能自助管理 schema、权限和工作流,对

THE END
喜欢就支持一下吧
点赞14 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容