YAML 是 Docker Compose, Kubernetes, CI/CD 流水线和 Ansible 的默认配置格式, YAML 格式化器解决的就是让这些文件重新变得可读. 粘贴任意 YAML 文档, 选择两种模式之一, 工具会在浏览器里整体重新输出文档, 缩进完全一致. 不存储, 不上传, 解析器和序列化器都跑在本机.
粘贴 YAML 并选择模式
这里没有实时重排: 只有按下按钮时才会处理文档. 格式化是默认模式, 以块状风格重建文档, 也就是大多数配置文件使用的一键一行布局. 压缩面向另一个目标, 生成解析器仍能读取的最紧凑表示. 一个小的缩进选择器让格式化在 2 空格和 4 空格之间切换, 它只在格式化模式出现, 因为压缩永远使用 2 空格.
格式化做了什么: 一份干净的块状文档
格式化把文档的每一层都归一到你选择的缩进. 嵌套的映射和序列对齐到固定偏移, 尾部空格消失, 一层永远等于一步缩进. 长值从不换行: 400 个字符的值仍然留在单行上, 因为在配置文件里, 结构的可读性比行长更重要.
压缩做了什么: 块状顶层之下的 flow 风格
压缩不会把文档压成一行, 这一点常让人意外. 顶层保持块状风格, 但每个顶层键之下的值都以 flow 形式写出: 字符串列表变成 items: [a, b], 嵌套映射变成 a: {b: [1, 2]}. 顶层的映射列表每行变成一个 flow 映射, 以短横线和左花括号开头. 在 flow 里可能被误读的值, 比如叫 y 的键, 会被加上引号以保持语义精确.
格式化丢弃和改写了什么
三件事值得在对比输出之前知道. 注释会被丢弃: 解析器先把文档变成数据结构, 注释在那一步就没了. 锚点和别名在解析时被理解, 但序列化器被配置为不输出引用, 所以每个别名都变回它所指向值的完整副本. 数字也会被规范化: 3.0 变成 3, 1e5 变成 100000, 0x10 变成 16, 空值, 波浪号和 null 都输出为 null, 而空字符串保持为空字符串并带引号.
键的顺序: 保持, 有一个例外
格式化不会给键排序. 字符串键完全保持文档中的顺序, 所以按 zebra, ant, m 排列的文件原样回来. 有一个看起来像排序的例外: 长得像整数的键, 比如 123, 会移到映射的最前面. 这不是格式化器选择了顺序, 而是持有解析结果的 JavaScript 对象列举属性的方式, 整数样键永远排在最前.
带行号和列号的错误信息
非法 YAML 不会得到含糊的失败. 解析器会报告问题所在, 附行号和列号, 都从 1 开始, 你可以直接跳到出错的位置. 重复键也以同样的方式被拒绝, 当复制的块不小心出现两次时这很有用. 有一个情况不同: 输入中出现第二个文档标记同样是错误, 但那条信息没有位置, 因为解析器在流级别就停了. 什么都不粘贴会显示一条专门的信息.
交换, 清除, 以及下一步
两个小控件收尾整个流程. 交换按钮在出现输出后显示, 把输出复制回输入并清空输出, 这让迭代修复很快: 格式化, 发现要重做的值, 交换, 编辑, 再格式化. 清除把两边和错误行都清空. 页面上什么都不存储, 敏感配置内容永远不会离开浏览器. 如果数据以 JSON 开始, 先用 JSON 格式化, 或直接走 JSON/YAML 转换器. XML 配置在 XML 格式化 里得到同样处理, 标记文件则参考 HTML 格式化教程, 它讲同样的格式化与压缩模式并带受保护脚本块.