D2:将文本转换为图表的现代图表脚本语言
D2 是一个开源文本转图表的脚本语言与命令行工具,用 .d2 文件描述结构后可导出 SVG、PNG、GIF、PDF、PPTX 等格式,支持多布局引擎(dagre、elk-go、TALA)、主题、字体与插件扩展,也可作为 Go 库在程序中生成图表,采用 Mozilla Public License 2.0 许可。
社区作者 · zZz
它解决什么问题
D2(仓库 d2lang/d2)是一门现代图表脚本语言,目标是把文本渲染成图表。官方描述为“A modern diagram scripting language that turns text to diagrams”。
主要用途与能力:
- 用声明式 .d2 文本描述节点、连线、容器与样式,由 CLI 渲染为图表;示例中通过 vars.d2-config 指定 layout-engine(如 elk)与 theme-id(如 300),并用 shape(stored_data、hexagon、cylinder、person、page)、style.multiple、style.stroke-dash 等属性控制外观(配图 3 为渲染示例)。
- 导出格式:支持 SVG、PNG、GIF、PDF、PPTX 导出。
- 主题与字体:内置多种官方主题,可在 ./d2themes 浏览并贡献自有主题;渲染默认字体为 “Source Sans Pro”,替换方式见 ./d2renderers/d2fonts。
- 语言工具链:解析器可从出错程序中解析多个错误,提供 autoformatter、语法高亮,并规划 LSP 等能力,便于创建和维护大型图表。
- 插件与可扩展性:插件系统可替换布局引擎并定制渲染管线,插件可随构建捆绑或作为独立二进制单独安装。内置布局引擎包括 Dagro(默认,捆绑,Dagre 有向图布局引擎的 Go 原生移植,基于 Graphviz DOT 算法,产出分层/层级布局)、elk-go(捆绑,ELK 的 Go 原生移植,适合带方向与端口的节点-连线图)、TALA(捆绑、需显式启用,面向软件架构图的原生布局与边路由引擎;可用 --layout=tala、环境变量 D2_LAYOUT=tala 或 D2 源码中 vars.d2-config 下的 layout-engine: tala 选择)。官方表示还计划集成 dot 等多种布局引擎以及时序图等单一用途布局类型。Sketch 模式渲染使用 rough-go(Rough.js 4.6.6 渲染面的 Go 兼容移植),LaTeX 标签使用 mathjax-go(MathJax 3.2.2 TeX-to-SVG 管线的 Go 原生移植)。
- 可编程使用:除 CLI 外,D2 也可在 Go 程序中用于生成图表,示例见 ./docs/examples/lib。
适用对象:需要以文本版本化维护图表的软件工程师、架构师、技术文档作者、DevOps/CI 流程维护者,以及希望在 VSCode、Vim、Obsidian、Emacs、Logseq、MkDocs、VitePress、Pandoc 等工具链中内嵌图表能力的团队。
生态与集成(官方插件):VSCode 扩展 https://github.com/d2lang/d2-vscode ;Vim 扩展 https://github.com/d2lang/d2-vim ;Obsidian 插件 https://github.com/d2lang/d2-obsidian 。
社区插件包括 Tree-sitter 语法、Emacs major mode、Goldmark 扩展、Telegram 机器人、Postgres 导入器、Structurizr 导出器、MdBook 预处理器、ROS2 导出器、org-mode 支持、Python 图表构建器、Clojure 转译器、JavaScript 图表构建器、C#/.
NET SDK、Maven 插件、Confluence 插件、CIL 转 D2、代码片段、Mongo 转 D2、Pandoc 过滤器(TypeScript/Python)、Logseq-D2、ent2d2、MkDocs 插件、Remark 插件、VitePress 插件、Zed 扩展、Hexo 扩展、Rehype 插件、AsyncAPI 转 D2、数据库 Schema 转 D2 等(均以仓库中列出的链接为准)。
其他资源:对比站 https://text-to-diagram.com (仓库 https://github.com/d2lang/text-to-diagram-site )、Playground(https://github.com/d2lang/d2-playground ,配图 2 为其入口按钮)、语言文档(https://github.com/d2lang/d2-docs )、托管图标 https://icons.d2lang.com 。
常见问题(来自 README):D2 不收集遥测;安装后除定期从 GitHub 检查版本更新外不使用网络连接;D2 不需要浏览器,可完全在服务端运行;下一版本变更见 ./ci/release/changelogs/next.md;求助渠道为 D2 Discord;功能请求、提案或缺陷请开 GitHub Issue;私人咨询邮箱 [email protected]。
使用 D2 撰写文档的知名开源项目(README 列出的部分):ElasticSearch、Sourcegraph、Temporal、Tauri、Rust GUI framework(78.5k stars)、Intellij、Coder、UC Berkeley、Coronacheck(荷兰新冠通行证官方应用)、Block Protocol(1.2k stars)、Dagger(8k stars)、Ivy Wallet(1.
1k stars)、LocalStack(46k stars)、Queue Library(Golang Goroutine 池库)。
— 本文由 AI 根据公开来源辅助整理,命令、版本与许可证请在使用前到原始页面复核。
安装 / 开始使用
一、准备环境
- 需要一个可用的终端(macOS、Linux 或 Windows);若要生成图表文件,准备一个工作目录用于存放 .d2 源文件与输出文件。
- README 未给出具体的最低系统版本、内存或磁盘要求,相关细节待核验,详见 ./docs/INSTALL.md。
二、方式一
官方安装脚本(最简便)
- 执行安装脚本:
curl -fsSL https://d2lang.com/install.sh | sh -s --- 若只想先查看脚本将执行的命令而不真正安装,可加 --dry-run 参数运行安装脚本。
- 官方说明:脚本的运行机制在文档中有详细描述;出于安全考虑,官方推荐优先使用操作系统自带的包管理器,并强调安装脚本本身并非不安全。
- 卸载(同样通过安装脚本):
curl -fsSL https://d2lang.com/install.sh | sh -s -- --uninstall三、方式二
已安装 Go 时从源码安装(不包含 manpage)
go install github.com/d2lang/d2@latest四、方式三
从源码安装 release(会包含 manpage) 见 ./docs/INSTALL.md#source-release 。
五、更详细的安装文档 见 ./docs/INSTALL.md ,其中针对每种操作系统给出了替代方法与示例,并详细描述了安装脚本的工作方式。
六、首次运行(Quickstart) README 给出的最快上手方式是把它当作 CLI 可执行程序,从 .d2 文件生成 SVG:
首先安装 D2(见上)
curl -fsSL https://d2lang.com/install.sh | sh -s --echo ' x -> y -> z ' > in.d2 d2 --watch in.d2 out.svg 执行后浏览器会打开 out.svg,并在 in.d2 发生变化时实时重新加载(live-reload)。
七、选择布局引擎(可选)
- 默认捆绑 dagre(Dagro)。
- 使用 elk-go:在 vars.d2-config 中设置 layout-engine(示例中为 layout-engine: elk)。
- 使用 TALA:以 --layout=tala、环境变量 D2_LAYOUT=tala,或在 D2 源码的 vars.d2-config 下写 layout-engine: tala。
八、常见问题
- D2 会收集遥测吗?不会。安装后不使用网络连接,仅会定期从 GitHub 检查版本更新。
- D2 需要浏览器吗?不需要,D2 可以完全在服务端运行。
- 下一版本有什么?见 ./ci/release/changelogs/next.md 。
- 遇到问题或需要帮助?在 D2 Discord 上提问。
- 有功能请求、提案或缺陷?请开 GitHub Issue。
- 私人咨询?发邮件至 [email protected] 。
- 安装相关的其它问题(如各系统差异、脚本细节)请查阅 ./docs/INSTALL.md。
九、图片参考
- 配图 1 为 D2 的 banner。
- 配图 2 为 D2 Playground 入口按钮。
- 配图 3 为 D2 渲染示例图(example.svg)。