YAML•
2025-06-13
•5 min
•alltools.one Team
YAMLMinificationOptimizationConfigurationPerformance
YAML 压缩:何时以及如何压缩 YAML 文件
YAML 的可读性来自于它对空白和缩进的大量使用。但有时你需要更紧凑的数据形式——用于传输、嵌入到其他格式中或减少存储空间。本指南介绍何时适合压缩以及实现压缩的技术。
什么是 YAML 压缩?
压缩会移除不必要的空白,同时保留数据结构:
压缩前(168 字节):
server:
host: localhost
port: 8080
features:
- auth
- logging
- monitoring
压缩后 — 流式风格(76 字节):
server: {host: localhost, port: 8080, features: [auth, logging, monitoring]}
压缩后 — JSON(相同数据,83 字节):
{"server":{"host":"localhost","port":8080,"features":["auth","logging","monitoring"]}}
YAML 的流式风格实际上比 JSON 稍微紧凑,因为它不需要为键加引号。
何时该压缩
适合压缩的场景
- 将 YAML 嵌入其他格式:将 YAML 字符串存储在 JSON 或数据库字段中
- 网络传输:减少高吞吐量系统的有效载荷大小
- 日志输出:在日志消息中使用紧凑表示
- 生成的输出:人类很少阅读的机器生成 YAML
不适合压缩的场景
- 配置文件:使用 YAML 的重点就是可读性
- 版本控制的文件:压缩后的 YAML 会产生糟糕的 diff
- 协作文件:团队成员需要阅读和编辑它们
- 模板和示例:文档价值会丧失
压缩技术
1. 转换为流式风格
YAML 支持映射和序列的内联表示法:
# 块风格(可读)
database:
host: localhost
port: 5432
options:
- sslmode=require
- timeout=30
# 流式风格(紧凑)
database: {host: localhost, port: 5432, options: [sslmode=require, timeout=30]}
2. 移除注释
注释没有数据价值,可以安全移除:
# 之前
server:
host: localhost # 主服务器
port: 8080 # HTTP 端口
# 之后
server:
host: localhost
port: 8080
3. 移除空行
额外的空行提高可读性但增加字节数:
# 之前(带分隔行)
database:
host: localhost
logging:
level: info
# 之后(紧凑)
database:
host: localhost
logging:
level: info
4. 转换为 JSON
如果不需要 YAML 特有功能(注释、锚点),转换为压缩的 JSON 是最紧凑的选择:
# 使用 yq
yq -o=json '.' config.yaml | jq -c . > config.min.json
命令行压缩
# 使用 yq 转换为流式风格
yq -o=yaml '.. style="flow"' config.yaml
# 转换为紧凑 JSON
yq -o=json -I=0 '.' config.yaml
# 使用 sed 移除注释(基础方法)
sed '/^[[:space:]]*#/d' config.yaml | sed 's/[[:space:]]*#.*//'
# Python 单行命令
python3 -c "
import yaml, sys
data = yaml.safe_load(sys.stdin)
yaml.dump(data, sys.stdout, default_flow_style=True, width=10000)
" < config.yaml
要进行交互式 YAML 格式化和压缩,请使用我们的 YAML 格式化工具。
大小对比
以一个典型的 Docker Compose 文件(10 个服务)为例:
| 格式 | 大小 | 比率 |
|---|---|---|
| 块式 YAML(可读) | 2,400 字节 | 1.0x |
| 流式 YAML(压缩) | 1,100 字节 | 0.46x |
| JSON(压缩) | 1,200 字节 | 0.50x |
| Gzip(块式 YAML) | 650 字节 | 0.27x |
关键洞察:Gzip 压缩比代码压缩有效得多。如果你通过启用了 gzip 的 HTTP 传输 YAML(这是标准做法),代码压缩能提供的额外收益很小。
更好的替代方案:压缩传输
对于网络传输,HTTP 压缩(gzip、brotli)几乎总是比代码压缩更好:
- Gzip 可以将块式 YAML 减少 70-80%
- 可读格式压缩后的大小与压缩后格式的大小相近
- 你可以保持可读性以便调试
块式 YAML → Gzip: 2,400 → 650 字节(减少 73%)
流式 YAML → Gzip: 1,100 → 580 字节(减少 47%)
压缩后的块式和压缩后的流式之间差异很小。
常见问题
压缩后的 YAML 仍然是有效的 YAML 吗?
是的。流式风格的 YAML 是完全有效的,任何 YAML 解析器都可以解析。它使用花括号表示映射,方括号表示序列——本质上是 YAML 中的类 JSON 语法。数据结构完全相同,只是格式不同。
应该压缩 Kubernetes 清单的 YAML 吗?
不应该。Kubernetes 清单应该是可读的、版本控制的且易于编辑的。使用标准的块式 YAML。如果需要减少传输大小,让部署工具处理压缩。Helm charts 和 Kustomize overlays 比压缩能更好地管理 YAML 复杂性。
相关资源
- YAML 格式化工具 — 格式化或压缩 YAML 文件
- YAML 语法教程 — 理解块式与流式风格
- JSON 转 YAML 转换 — 在格式之间转换