AI 能写代码了,为什么我反而开始要求它先写文档?

最近在尝试用 AI 参与项目开发。

刚开始我的方式很简单:

text 复制代码
提需求
↓
让 AI 直接实现
↓
不断返工
↓
继续补需求

结果非常熟悉:

  • 功能能跑
  • 代码越来越多
  • 需求越来越乱
  • AI 上下文越来越长
  • 后面谁都不敢接手

尤其是涉及:

  • 前后端联动
  • 权限体系
  • 数据结构变更
  • API 契约
  • 多阶段迭代

时,问题会迅速放大。

后来我接触到了 GitHub 开源的 Spec Kit。

它让我第一次把 AI 开发从:

text 复制代码
直接写代码

变成:

text 复制代码
先规格
↓
再设计
↓
再拆任务
↓
最后实现

整个过程开始变得可控。


Spec Kit 到底是什么?

如果用一句话概括:

Spec Kit = 把一次开发过程工程化。

它不会让 AI 直接开始改代码。

而是要求先产出一套完整工程文档。

例如:

text 复制代码
constitution
spec
plan
tasks
checklists
contracts
research

最终形成类似结构:

text 复制代码
specs/
 ├── spec.md
 ├── plan.md
 ├── tasks.md
 ├── research.md
 ├── data-model.md
 ├── quickstart.md
 ├── contracts/
 └── checklists/

看起来像是多写了一堆 Markdown。

但实际作用是:

把需求从聊天记录里解放出来。

让需求、设计、任务、实现都能够被追踪、被审查、被交接。


为什么 AI 项目越来越需要 Spec?

以前开发靠的是:

text 复制代码
需求文档
↓
开发
↓
测试

现在很多团队变成:

text 复制代码
需求
↓
AI
↓
代码

中间设计环节直接没了。

于是会出现几个经典问题。


问题 1:需求隐藏在聊天记录里

AI 写了很多代码。

一个月后再看:

text 复制代码
为什么这样设计?

没人知道。

因为答案在某次聊天记录里。


问题 2:实现范围不断膨胀

最开始:

text 复制代码
做一个文章管理

后来:

text 复制代码
加权限
加审核
加草稿
加发布
加版本

最后:

text 复制代码
已经完全不是最初那个需求

但没人知道边界在哪里。


问题 3:Agent 交接困难

A Agent 做了一半。

换 B Agent。

B Agent:

text 复制代码
重新理解项目
重新分析代码
重新推导需求

大量时间浪费在上下文恢复。


Spec Kit 最有价值的其实不是 Spec

很多人第一次接触会觉得:

text 复制代码
不就是生成几个 md 文件吗?

实际上真正有价值的是:

Clarify

也就是需求澄清。

这是我实践下来收益最大的环节。

例如:

text 复制代码
删除是软删除还是硬删除?

看起来简单。

但会影响:

  • 数据库设计
  • API 设计
  • 权限体系
  • 审计记录
  • 自动化测试

又比如:

text 复制代码
上线策略是什么?

是:

text 复制代码
全部完成后开放

还是:

text 复制代码
灰度发布

会直接影响:

  • 发布方案
  • 数据迁移方案
  • 风险控制方案

这些问题如果在代码完成后才发现。

返工成本非常高。


我目前的使用流程

经过几轮实践后。

我基本固定成下面这套流程:

text 复制代码
Constitution
↓
Specify
↓
Clarify
↓
Checklist
↓
Plan
↓
Tasks
↓
Analyze
↓
Implement

对应就是:

text 复制代码
项目原则
↓
需求规格
↓
需求澄清
↓
质量检查
↓
技术设计
↓
任务拆解
↓
一致性分析
↓
代码实现

整个过程更像:

text 复制代码
产品经理
↓
架构师
↓
Tech Lead
↓
开发

而不是:

text 复制代码
需求
↓
AI
↓
代码

一套我实际在用的工作流

对于正式功能开发。

我基本都会按照下面的顺序推进:

text 复制代码
1. Constitution
建立项目级原则

2. Specify
生成功能规格

3. Clarify
澄清需求边界

4. Checklist
检查需求质量

5. Plan
生成技术方案

6. Tasks
拆分可执行任务

7. Analyze
检查文档一致性

8. Implement
按任务实现代码

如果是实验性功能。

我会简化成:

text 复制代码
Specify
↓
Plan
↓
Tasks
↓
Implement

如果涉及:

  • 数据库
  • 权限
  • API
  • 发布策略

那么 Clarify、Checklist、Analyze 基本不会跳过。


如果你想体验 Spec Kit

实际上上手成本并不高。

首先安装 uv:

bash 复制代码
brew install uv

然后安装 Spec Kit:

bash 复制代码
uv tool install specify-cli \
  --from git+https://github.com/github/spec-kit.git

安装完成后验证:

bash 复制代码
specify version

进入项目目录:

bash 复制代码
cd your-project

初始化当前项目:

bash 复制代码
specify init --here \
  --integration codex \
  --integration-options="--skills"

或者:

bash 复制代码
uvx --from git+https://github.com/github/spec-kit.git \
  specify init .

初始化完成后。

项目里会出现类似结构:

text 复制代码
.agents/
  skills/
    speckit-constitution/
    speckit-specify/
    speckit-clarify/
    speckit-plan/
    speckit-tasks/
    speckit-implement/

.specify/
  templates/
  memory/

specs/

后续所有需求都会围绕这些文档进行演进。


如果你的 Agent 没有自动识别这些 Skill。

可以主动调用:

text 复制代码
[$speckit-constitution]
[$speckit-specify]
[$speckit-clarify]
[$speckit-checklist]
[$speckit-plan]
[$speckit-tasks]
[$speckit-analyze]
[$speckit-implement]

我自己的实践里。

并不是通过一个统一命令完成所有事情。

而是把它理解成:

text 复制代码
一套 AI 软件工程工作流

然后按阶段调用。


我认为最应该写好的两个文件

如果时间有限。

不要追求把所有文档都写到极致。

优先保证:

1. Constitution

项目宪章。

例如:

text 复制代码
禁止随意增加依赖
优先复用现有组件
必须通过 TS 检查
核心逻辑必须有测试
API 必须考虑兼容

这决定了 AI 后面会怎么做事。


2. Plan

技术计划。

因为后续 Agent 最常看的其实不是 Spec。

而是:

text 复制代码
plan.md

这里会记录:

  • 技术方案
  • 数据模型
  • API 设计
  • 测试策略
  • 发布策略

很多时候看 Plan 就能快速恢复上下文。


Spec Kit 不适合所有项目

如果只是:

text 复制代码
改个按钮颜色
修一个 Bug
写一个脚本

直接让 AI 改更快。

Spec Kit 更适合:

✅ 中大型功能

✅ 前后端联动

✅ 数据结构变更

✅ 权限体系

✅ 多 Agent 协作

✅ 长周期迭代

这种场景收益会非常明显。


参考资料

GitHub Spec Kit

https://github.com/github/spec-kit

官方文档

https://github.github.com/spec-kit/

Installation Guide

https://github.github.com/spec-kit/installation.html

Quick Start Guide

https://github.github.com/spec-kit/quickstart.html

GitHub 官方介绍

https://github.blog/ai-and-ml/generative-ai/spec-driven-development-with-ai-get-started-with-a-new-open-source-toolkit/


最后的感受

用了几轮之后。

我最大的变化不是:

text 复制代码
AI 写代码更快了

而是:

text 复制代码
AI 开发终于开始像工程开发了

Spec Kit 的核心从来不是生成多少 Markdown。

而是强迫你在实现之前回答清楚:

  • 要解决什么问题
  • 用户到底是谁
  • 验收标准是什么
  • 数据边界是什么
  • 权限边界是什么
  • 如何测试
  • 如何发布
  • 什么才算真正完成

对于复杂项目来说。

这些问题想清楚之后。

代码反而成了最简单的部分。

我觉得 Spec Kit 真正解决的不是 AI 写代码的问题。

而是 AI 项目失控的问题。

当功能开始涉及多人协作、长期迭代、数据模型、权限体系和发布策略时。

代码往往不是最难的部分。

真正难的是:

如何让所有人、所有 Agent,对同一件事保持一致理解。

而 Spec Kit 本质上是在给 AI 开发补回软件工程里曾经被省略掉的那一层。

这里写自定义目录标题

欢迎使用Markdown编辑器

你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

新的改变

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计 ,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
  3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法[1](#甘特图的mermaid语法1) 功能;
  6. 增加了 多屏幕编辑 Markdown文章功能;
  7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  8. 增加了 检查列表 功能。

功能快捷键

撤销:Ctrl/Command + Z

重做:Ctrl/Command + Y

加粗:Ctrl/Command + B

斜体:Ctrl/Command + I

标题:Ctrl/Command + Shift + H

无序列表:Ctrl/Command + Shift + U

有序列表:Ctrl/Command + Shift + O

检查列表:Ctrl/Command + Shift + C

插入代码:Ctrl/Command + Shift + K

插入链接:Ctrl/Command + Shift + L

插入图片:Ctrl/Command + Shift + G

查找:Ctrl/Command + F

替换:Ctrl/Command + G

合理的创建标题,有助于目录的生成

直接输入1次#,并按下space后,将生成1级标题。

输入2次#,并按下space后,将生成2级标题。

以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

插入链接与图片

链接: link.

图片:

带尺寸的图片:

居中的图片:

居中并且带尺寸的图片:

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

javascript 复制代码
// An highlighted block
var foo = 'bar';

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目 Value
电脑 $1600
手机 $12
导管 $1

设定内容居中、居左、居右

使用:---------:居中

使用:----------居左

使用----------:居右

第一列 第二列 第三列
第一列文本居中 第二列文本居右 第三列文本居左

SmartyPants

SmartyPants 是一个文本转换工具,主要功能是将普通的 ASCII 标点符号自动转换为更美观的印刷体标点符号。例如:

原始符号 转换后 说明
"引号" "引号" 直引号变弯引号
'单引号' '单引号' 直单引号变弯单引号
-- -- 两个连字符变短破折号
--- --- 三个连字符变长破折号
... ... 三个点变省略号

创建一个自定义列表

:
Text-to- conversion tool
: John
: Luke

如何创建一个注脚

一个具有注脚的文本。[2](#2)

注释也是必不可少的

Markdown将文本转换为 。

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n−1)!∀n∈N 是通过欧拉积分

Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞tz−1e−tdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

#mermaid-svg-1i7Ky9ImIuIpGZj9{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-1i7Ky9ImIuIpGZj9 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .error-icon{fill:#552222;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .marker.cross{stroke:#333333;}#mermaid-svg-1i7Ky9ImIuIpGZj9 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-1i7Ky9ImIuIpGZj9 p{margin:0;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .mermaid-main-font{font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .exclude-range{fill:#eeeeee;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .section{stroke:none;opacity:0.2;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .section0{fill:rgba(102, 102, 255, 0.49);}#mermaid-svg-1i7Ky9ImIuIpGZj9 .section2{fill:#fff400;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .section1,#mermaid-svg-1i7Ky9ImIuIpGZj9 .section3{fill:white;opacity:0.2;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .sectionTitle0{fill:#333;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .sectionTitle1{fill:#333;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .sectionTitle2{fill:#333;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .sectionTitle3{fill:#333;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .sectionTitle{text-anchor:start;font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .grid .tick{stroke:lightgrey;opacity:0.8;shape-rendering:crispEdges;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .grid .tick text{font-family:"trebuchet ms",verdana,arial,sans-serif;fill:#333;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .grid path{stroke-width:0;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .today{fill:none;stroke:red;stroke-width:2px;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .task{stroke-width:2;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .taskText{text-anchor:middle;font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .taskTextOutsideRight{fill:black;text-anchor:start;font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .taskTextOutsideLeft{fill:black;text-anchor:end;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .task.clickable{cursor:pointer;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .taskText.clickable{cursor:pointer;fill:#003163!important;font-weight:bold;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163!important;font-weight:bold;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163!important;font-weight:bold;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .taskText0,#mermaid-svg-1i7Ky9ImIuIpGZj9 .taskText1,#mermaid-svg-1i7Ky9ImIuIpGZj9 .taskText2,#mermaid-svg-1i7Ky9ImIuIpGZj9 .taskText3{fill:white;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .task0,#mermaid-svg-1i7Ky9ImIuIpGZj9 .task1,#mermaid-svg-1i7Ky9ImIuIpGZj9 .task2,#mermaid-svg-1i7Ky9ImIuIpGZj9 .task3{fill:#8a90dd;stroke:#534fbc;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .taskTextOutside0,#mermaid-svg-1i7Ky9ImIuIpGZj9 .taskTextOutside2{fill:black;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .taskTextOutside1,#mermaid-svg-1i7Ky9ImIuIpGZj9 .taskTextOutside3{fill:black;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .active0,#mermaid-svg-1i7Ky9ImIuIpGZj9 .active1,#mermaid-svg-1i7Ky9ImIuIpGZj9 .active2,#mermaid-svg-1i7Ky9ImIuIpGZj9 .active3{fill:#bfc7ff;stroke:#534fbc;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .activeText0,#mermaid-svg-1i7Ky9ImIuIpGZj9 .activeText1,#mermaid-svg-1i7Ky9ImIuIpGZj9 .activeText2,#mermaid-svg-1i7Ky9ImIuIpGZj9 .activeText3{fill:black!important;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .done0,#mermaid-svg-1i7Ky9ImIuIpGZj9 .done1,#mermaid-svg-1i7Ky9ImIuIpGZj9 .done2,#mermaid-svg-1i7Ky9ImIuIpGZj9 .done3{stroke:grey;fill:lightgrey;stroke-width:2;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneText0,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneText1,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneText2,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneText3{fill:black!important;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneText0.taskTextOutsideLeft,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneText0.taskTextOutsideRight,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneText1.taskTextOutsideLeft,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneText1.taskTextOutsideRight,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneText2.taskTextOutsideLeft,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneText2.taskTextOutsideRight,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneText3.taskTextOutsideLeft,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneText3.taskTextOutsideRight{fill:black!important;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .crit0,#mermaid-svg-1i7Ky9ImIuIpGZj9 .crit1,#mermaid-svg-1i7Ky9ImIuIpGZj9 .crit2,#mermaid-svg-1i7Ky9ImIuIpGZj9 .crit3{stroke:#ff8888;fill:red;stroke-width:2;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .activeCrit0,#mermaid-svg-1i7Ky9ImIuIpGZj9 .activeCrit1,#mermaid-svg-1i7Ky9ImIuIpGZj9 .activeCrit2,#mermaid-svg-1i7Ky9ImIuIpGZj9 .activeCrit3{stroke:#ff8888;fill:#bfc7ff;stroke-width:2;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneCrit0,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneCrit1,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneCrit2,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneCrit3{stroke:#ff8888;fill:lightgrey;stroke-width:2;cursor:pointer;shape-rendering:crispEdges;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .milestone{transform:rotate(45deg) scale(0.8,0.8);}#mermaid-svg-1i7Ky9ImIuIpGZj9 .milestoneText{font-style:italic;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneCritText0,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneCritText1,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneCritText2,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneCritText3{fill:black!important;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneCritText0.taskTextOutsideLeft,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneCritText0.taskTextOutsideRight,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneCritText1.taskTextOutsideLeft,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneCritText1.taskTextOutsideRight,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneCritText2.taskTextOutsideLeft,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneCritText2.taskTextOutsideRight,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneCritText3.taskTextOutsideLeft,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneCritText3.taskTextOutsideRight{fill:black!important;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .vert{stroke:navy;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .vertText{font-size:15px;text-anchor:middle;fill:navy!important;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .activeCritText0,#mermaid-svg-1i7Ky9ImIuIpGZj9 .activeCritText1,#mermaid-svg-1i7Ky9ImIuIpGZj9 .activeCritText2,#mermaid-svg-1i7Ky9ImIuIpGZj9 .activeCritText3{fill:black!important;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .titleText{text-anchor:middle;font-size:18px;fill:#333;font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-1i7Ky9ImIuIpGZj9 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 2014-01-07 2014-01-09 2014-01-11 2014-01-13 2014-01-15 2014-01-17 2014-01-19 2014-01-21 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid

  • 关于 甘特图 语法,参考 这儿,

UML图表

可以使用UML图表进行渲染,例如下面产生的一个序列图:
王五 李四 张三 王五 李四 张三 #mermaid-svg-obZEOp0icZk5u4Um{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-obZEOp0icZk5u4Um .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-obZEOp0icZk5u4Um .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-obZEOp0icZk5u4Um .error-icon{fill:#552222;}#mermaid-svg-obZEOp0icZk5u4Um .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-obZEOp0icZk5u4Um .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-obZEOp0icZk5u4Um .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-obZEOp0icZk5u4Um .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-obZEOp0icZk5u4Um .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-obZEOp0icZk5u4Um .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-obZEOp0icZk5u4Um .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-obZEOp0icZk5u4Um .marker{fill:#333333;stroke:#333333;}#mermaid-svg-obZEOp0icZk5u4Um .marker.cross{stroke:#333333;}#mermaid-svg-obZEOp0icZk5u4Um svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-obZEOp0icZk5u4Um p{margin:0;}#mermaid-svg-obZEOp0icZk5u4Um .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-obZEOp0icZk5u4Um text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-obZEOp0icZk5u4Um .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-obZEOp0icZk5u4Um .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-obZEOp0icZk5u4Um .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-obZEOp0icZk5u4Um .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-obZEOp0icZk5u4Um #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-obZEOp0icZk5u4Um .sequenceNumber{fill:white;}#mermaid-svg-obZEOp0icZk5u4Um #sequencenumber{fill:#333;}#mermaid-svg-obZEOp0icZk5u4Um #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-obZEOp0icZk5u4Um .messageText{fill:#333;stroke:none;}#mermaid-svg-obZEOp0icZk5u4Um .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-obZEOp0icZk5u4Um .labelText,#mermaid-svg-obZEOp0icZk5u4Um .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-obZEOp0icZk5u4Um .loopText,#mermaid-svg-obZEOp0icZk5u4Um .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-obZEOp0icZk5u4Um .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-obZEOp0icZk5u4Um .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-obZEOp0icZk5u4Um .noteText,#mermaid-svg-obZEOp0icZk5u4Um .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-obZEOp0icZk5u4Um .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-obZEOp0icZk5u4Um .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-obZEOp0icZk5u4Um .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-obZEOp0icZk5u4Um .actorPopupMenu{position:absolute;}#mermaid-svg-obZEOp0icZk5u4Um .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-obZEOp0icZk5u4Um .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-obZEOp0icZk5u4Um .actor-man circle,#mermaid-svg-obZEOp0icZk5u4Um line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-obZEOp0icZk5u4Um :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 李四想了很长时间, 文字太长了 不适合放在一行. 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 打量着王五... 很好... 王五, 你怎么样?

  • 关于 UML图表 语法,参考 这儿,

流程图

#mermaid-svg-v0GFKDjtOXtaHxTJ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-v0GFKDjtOXtaHxTJ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-v0GFKDjtOXtaHxTJ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-v0GFKDjtOXtaHxTJ .error-icon{fill:#552222;}#mermaid-svg-v0GFKDjtOXtaHxTJ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-v0GFKDjtOXtaHxTJ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-v0GFKDjtOXtaHxTJ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-v0GFKDjtOXtaHxTJ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-v0GFKDjtOXtaHxTJ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-v0GFKDjtOXtaHxTJ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-v0GFKDjtOXtaHxTJ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-v0GFKDjtOXtaHxTJ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-v0GFKDjtOXtaHxTJ .marker.cross{stroke:#333333;}#mermaid-svg-v0GFKDjtOXtaHxTJ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-v0GFKDjtOXtaHxTJ p{margin:0;}#mermaid-svg-v0GFKDjtOXtaHxTJ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-v0GFKDjtOXtaHxTJ .cluster-label text{fill:#333;}#mermaid-svg-v0GFKDjtOXtaHxTJ .cluster-label span{color:#333;}#mermaid-svg-v0GFKDjtOXtaHxTJ .cluster-label span p{background-color:transparent;}#mermaid-svg-v0GFKDjtOXtaHxTJ .label text,#mermaid-svg-v0GFKDjtOXtaHxTJ span{fill:#333;color:#333;}#mermaid-svg-v0GFKDjtOXtaHxTJ .node rect,#mermaid-svg-v0GFKDjtOXtaHxTJ .node circle,#mermaid-svg-v0GFKDjtOXtaHxTJ .node ellipse,#mermaid-svg-v0GFKDjtOXtaHxTJ .node polygon,#mermaid-svg-v0GFKDjtOXtaHxTJ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-v0GFKDjtOXtaHxTJ .rough-node .label text,#mermaid-svg-v0GFKDjtOXtaHxTJ .node .label text,#mermaid-svg-v0GFKDjtOXtaHxTJ .image-shape .label,#mermaid-svg-v0GFKDjtOXtaHxTJ .icon-shape .label{text-anchor:middle;}#mermaid-svg-v0GFKDjtOXtaHxTJ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-v0GFKDjtOXtaHxTJ .rough-node .label,#mermaid-svg-v0GFKDjtOXtaHxTJ .node .label,#mermaid-svg-v0GFKDjtOXtaHxTJ .image-shape .label,#mermaid-svg-v0GFKDjtOXtaHxTJ .icon-shape .label{text-align:center;}#mermaid-svg-v0GFKDjtOXtaHxTJ .node.clickable{cursor:pointer;}#mermaid-svg-v0GFKDjtOXtaHxTJ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-v0GFKDjtOXtaHxTJ .arrowheadPath{fill:#333333;}#mermaid-svg-v0GFKDjtOXtaHxTJ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-v0GFKDjtOXtaHxTJ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-v0GFKDjtOXtaHxTJ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-v0GFKDjtOXtaHxTJ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-v0GFKDjtOXtaHxTJ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-v0GFKDjtOXtaHxTJ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-v0GFKDjtOXtaHxTJ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-v0GFKDjtOXtaHxTJ .cluster text{fill:#333;}#mermaid-svg-v0GFKDjtOXtaHxTJ .cluster span{color:#333;}#mermaid-svg-v0GFKDjtOXtaHxTJ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-v0GFKDjtOXtaHxTJ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-v0GFKDjtOXtaHxTJ rect.text{fill:none;stroke-width:0;}#mermaid-svg-v0GFKDjtOXtaHxTJ .icon-shape,#mermaid-svg-v0GFKDjtOXtaHxTJ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-v0GFKDjtOXtaHxTJ .icon-shape p,#mermaid-svg-v0GFKDjtOXtaHxTJ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-v0GFKDjtOXtaHxTJ .icon-shape .label rect,#mermaid-svg-v0GFKDjtOXtaHxTJ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-v0GFKDjtOXtaHxTJ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-v0GFKDjtOXtaHxTJ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-v0GFKDjtOXtaHxTJ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 链接
长方形

圆角长方形
菱形

  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart.js的流程图语法:
Created with Raphaël 2.3.0 开始 我的操作 确认? 结束 yes no

  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,

继续你的创作。


  1. mermaid语法说明 ↩︎

  2. 注脚的解释 ↩︎

*[HTML]: 超文本标记语言