alltools.one
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 复杂性。

相关资源

Published on 2025-06-13
YAML Minification: When and How to Compress YAML Files | alltools.one