Skip to content

Decap CMS:让编辑者更新静态网站,不必先学 Git

静态网站把文章放在 Markdown 文件里,对开发者很顺手,对内容编辑者却不够友好。改一个标题可能要找到文件、理解 frontmatter、提交 Git,再等构建系统发布。Decap CMS 在网站的 /admin/ 路径放入一个浏览器编辑后台,编辑者看到的是表单、媒体库和发布状态,保存后发生的仍然是 Git 文件变更。

这套做法保留了静态站点原本的优点:内容可以跟代码一起做版本管理,分支和 Pull Request 仍能承担审核,迁移时也能带走普通文本文件。团队获得编辑界面的同时,需要自己处理认证、仓库权限、构建和发布失败。

已经使用 Hugo、Jekyll、Gatsby 或静态导出框架,并希望内容同事独立更新网站的团队,最值得继续了解。需要实时协作、复杂关系查询、精细角色权限或托管式内容 API 时,数据库型或 SaaS 内容管理系统通常更合适。

一次内容更新,最后落在哪里

打开 /admin/ 后,编辑者选择一篇文章,在表单里修改标题和正文。Decap CMS 根据 config.yml 找到对应的内容目录和字段,把表单数据写回仓库配置指定的内容文件,再交给选定的后端保存。使用 GitHub 后端时,固定提交中的配置和测试材料覆盖直接提交、编辑工作流与开放式贡献这些路径;具体产生哪一种提交或 Pull Request,仍取决于后端配置和权限。

Mermaid 流程图
查看源码
flowchart LR
  editor[编辑者填写表单] --> admin[Decap CMS /admin]
  config[config.yml\n内容模型与目录] --> admin
  admin --> backend[Git 后端适配器]
  backend --> repo[(内容仓库)]
  repo --> review{直接提交或 PR 审核}
  review --> build[静态站点构建]
  build --> site[公开网站]

这张图有一个容易忽略的重点:Decap CMS 本身不接管内容数据库。Git 仓库继续保存内容事实,静态站点生成器继续负责把文件变成网页,CMS 只把两者之间最难用的编辑环节变成浏览器界面。仓库 README把这套形态定义为嵌入站点 /admin/ 的单页应用。

三个真正影响使用体验的设计

内容模型写在配置里

config.yml 决定后端、媒体目录、内容集合和字段。下面的配置把 content/posts 目录变成可创建文章的 Posts 集合,并把正文交给 Markdown 编辑器。

yaml
backend:
  name: github
  repo: owner/site-content
  branch: main

media_folder: static/images/uploads
public_folder: /images/uploads

collections:
  - name: posts
    label: Posts
    folder: content/posts
    create: true
    fields:
      - { label: Title, name: title, widget: string }
      - { label: Date, name: date, widget: datetime }
      - { label: Body, name: body, widget: markdown }

字段顺序、文件目录和媒体 URL 都能从配置中读出来,因此内容模型也能进入代码审查。官方的配置说明还覆盖多语言、媒体处理、预览链接、发布模式和集合视图。首轮接入没有必要一次启用所有选项,先跑通一个集合更容易定位问题。

编辑界面与 Git 审核可以共存

普通模式与编辑工作流都由 GitHub 后端的实现和测试材料覆盖。将 publish_mode 设为 editorial_workflow 后,固定提交中的实现和测试场景意图是把草稿、审核和发布组织到分支与 Pull Request 路径;GitHub 后端也包含开放式贡献配置。文章可以据此解释静态设计,不能把未运行的测试场景当成已经完成的线上验证。

这时内容团队可以不操作 Git 命令,开发团队仍能沿用分支保护和 Pull Request 审核。上线前需要结合当前 GitHub 应用、仓库权限、分支规则和认证服务逐项核对;固定提交中的 Cypress 场景只能作为测试范围参考,本次分析没有执行这些场景。

后端和字段能力可以替换

默认应用通过扩展注册模块集中登记 GitHub 和多个 Git 后端,以及字段组件、编辑器组件和语言包。核心编辑器不必为每一种 Git 服务和字段类型重写整套页面。

这种扩展方式让 Decap CMS 能覆盖多种托管平台,也带来一个现实成本:后端认证、媒体处理和字段组件的兼容性都需要单独验证。多后端不等于零配置迁移。

用一个测试仓库完成第一次有效试用

第一次试用的目标不应停在“能打开后台”。更有意义的验收是:编辑者登录后修改一篇测试文章,仓库出现可追溯变更,静态站点成功构建,而且团队知道如何撤销这次修改。

准备条件

  • 一个已经能够正常构建的静态站点测试仓库;
  • 明确的内容目录与媒体目录;
  • 一个受支持的认证方案,以及最小必要仓库权限;
  • 可观察构建状态和回滚提交的方式。

接入最小后台

仓库 README 给出的轻量路径是在 admin/index.html 引入固定版本的 CDN 文件。需要自定义扩展或统一依赖管理时,再改用 npm 包。

html
<!doctype html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>Content Manager</title>
  </head>
  <body>
    <script src="https://unpkg.com/decap-cms@3.15.1/dist/decap-cms.js"></script>
  </body>
</html>

随后把上一节的配置保存为 admin/config.yml,将仓库名、分支和目录替换成测试项目的真实值。GitHub 后端的认证页面、令牌范围和仓库权限需要按当前 OAuth 应用与官方配置逐项核对;使用 Git Gateway 时,固定源码确认 Netlify Identity 与 Git Gateway、JWT/PKCE 及大文件媒体路径之间存在集成边界。两条路径的责任边界不同,不能只改 backend.name 就认为认证已经完成。

观察四个成功信号

  1. /admin/ 能加载配置并显示 Posts 集合。
  2. 编辑者能在预期权限下登录、打开一篇文章并保存修改。
  3. Git 仓库出现符合发布模式的 commit、分支或 Pull Request,媒体文件落在预期目录。
  4. 静态站点构建成功,新内容可见;撤销提交后,网站能够回到原状态。

如果后台能打开但保存失败,按当前后端文档和测试环境逐项检查认证配置、令牌权限、目标分支、分支保护与 API 响应;本文没有运行真实 GitHub 后端,因此不把某一种失败原因写成已验证结论。如果仓库已变化但页面没有更新,则把排查重点转向构建触发、内容目录、媒体公开路径和缓存,而不是继续修改 CMS 表单。

按下保存后,内部怎样接力

理解一次保存不需要先读完二十多个包。沿着“浏览器启动、加载配置、选择后端、写入 Git”四个阶段看,核心职责已经足够清楚。

Mermaid 流程图
查看源码
sequenceDiagram
  participant Browser as 浏览器 /admin
  participant App as 默认应用
  participant Core as CMS 核心
  participant Backend as Git 后端
  participant Repo as 内容仓库
  Browser->>App: 加载 CMS bundle
  App->>Core: 注册扩展并初始化
  Core->>Core: 读取 config.yml 并认证
  Browser->>Core: 编辑并保存内容
  Core->>Backend: 交付内容与媒体
  Backend->>Repo: 写入文件、commit 或 PR
  Repo-->>Browser: 返回保存或审核状态

应用入口会在未开启手动初始化时调用 CMS.init()启动模块创建 React 根节点,装配全局状态和页面路由,再依次加载配置与认证用户。

编辑器保存内容时,entry actions负责选择当前后端或集成提供方,并协调内容与媒体的序列化和持久化。GitHub 实现再读取分支、开放式贡献、媒体和 API 相关配置。

固定源码能确认 REST 与 GraphQL 两套访问实现共同存在,但不足以把所有保存分支压缩成一条确定的函数调用链。GraphQL 客户端负责仓库对象、文件内容和 Pull Request 等查询;具体写入方式仍应结合当前配置、实现代码和对应测试核对。

选择后端,也是在选择运维责任

方案适合场景团队需要承担
GitHub 后端内容就在 GitHub,团队愿意按官方方式配置认证和仓库权限OAuth 应用、令牌范围、API 响应、分支与 PR 策略需要单独核对
Git Gateway希望采用固定源码确认的 Netlify Identity/Git Gateway 集成身份服务、网关可用性、JWT/PKCE、代理权限与服务依赖需要单独核对
其他后端内容托管在仓库已登记的其他 Git 平台具体平台的认证、API、媒体与工作流兼容性需要查对应后端文档

Git Gateway 与 GitHub 后端不是同一个认证入口。Git Gateway 实现确认了 Netlify Identity、Git Gateway、身份令牌、授权码保护流程和大文件媒体路径的代码边界;团队还要核对所依赖服务的当前可用性和条款。

什么时候应该换一种 CMS

需求重心更值得比较的方向主要取舍
Git 文件、静态构建、PR 审核Decap CMS内容可迁移,认证与 Git 运维由团队承担
React 中的可视化编辑体验TinaCMS 等 Git 或可视化编辑方案编辑体验与平台模型更紧密
托管 API、结构化查询、团队权限Sanity、Contentful 等 SaaS CMS运维较少,但增加费用和平台依赖
自建数据库与通用内容 APIDirectus、Strapi 等数据库型 CMS数据关系更强,部署与数据运维范围更大

如果团队只是维护少量页面,而且所有编辑者都会 Git,增加 CMS 可能比直接完善 Markdown 模板更重。相反,当内容更新频繁、编辑者不应接触仓库细节,又希望保留提交历史时,Decap CMS 的边界会很清楚。

版本与继续验证

本文基于 Decap CMS 3.15.1 和固定源码提交 2b772c7,核对日期为 2026 年 8 月 30 日。仓库采用 MIT 许可证,源码主要由 JavaScript 与 TypeScript 构成。

本次核对阅读了项目 README、配置模型、应用入口、启动流程、GitHub 与 Git Gateway 后端、entry actions、测试目录和构建脚本;没有安装或运行目标仓库,也没有登录真实 GitHub 后端。静态阅读可以支撑架构和接入判断,不能代替生产环境中的认证、保存、冲突、媒体和回滚测试。需要精确比较后端行为时,应继续阅读固定提交下对应实现和具体测试文件。

实际采用前,建议用一个可以随时删除的测试仓库走完本文的四个成功信号,再核对 仓库主页最新 Release官方配置文档。主分支、后端 API 或认证服务发生变化时,应重新验证相关结论。

全部公开文章由同一个站点构建和发布。