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

壓縮後——Flow 樣式(76 位元組):

server: {host: localhost, port: 8080, features: [auth, logging, monitoring]}

壓縮後——JSON(相同資料,83 位元組):

{"server":{"host":"localhost","port":8080,"features":["auth","logging","monitoring"]}}

YAML 的 Flow 樣式實際上比 JSON 更精簡,因為它不需要為鍵加上引號。

何時進行壓縮

應該壓縮的情況

  • 將 YAML 嵌入其他格式:在 JSON 或資料庫欄位中儲存 YAML 字串
  • 網路傳輸:減少高吞吐量系統的負載大小
  • 日誌輸出:日誌訊息中的精簡表示
  • 產生的輸出:人類很少閱讀的機器產生 YAML

不應壓縮的情況

  • 設定檔:可讀性正是使用 YAML 的意義所在
  • 版本控制的檔案:壓縮過的 YAML 會產生糟糕的差異比對
  • 協作檔案:團隊成員需要閱讀和編輯
  • 範本和範例:文件價值會喪失

壓縮技巧

1. 轉換為 Flow 樣式

YAML 支援映射和序列的行內表示法:

# Block 樣式(可讀)
database:
  host: localhost
  port: 5432
  options:
    - sslmode=require
    - timeout=30

# Flow 樣式(精簡)
database: {host: localhost, port: 5432, options: [sslmode=require, timeout=30]}

2. 移除註解

註解不包含資料值,可以安全移除:

# 之前
server:
  host: localhost  # Main server
  port: 8080       # HTTP port

# 之後
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 轉換為 Flow 樣式
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 個服務)為例:

格式大小比率
Block YAML(可讀)2,400 位元組1.0x
Flow YAML(壓縮)1,100 位元組0.46x
JSON(壓縮)1,200 位元組0.50x
Gzip(Block YAML)650 位元組0.27x

關鍵洞見:Gzip 壓縮遠比 YAML 壓縮更有效。如果你透過啟用了 Gzip 的 HTTP 傳輸 YAML(這是標準做法),壓縮帶來的額外收益微乎其微。

更好的替代方案:壓縮傳輸

對於網路傳輸,HTTP 壓縮(Gzip、Brotli)幾乎總是比壓縮更好的選擇:

  • Gzip 可將 Block 樣式 YAML 減少 70-80%
  • 可讀格式壓縮後的大小與壓縮格式相近
  • 你可以保持可讀性以便除錯
Block YAML → Gzip: 2,400 → 650 位元組(減少 73%)
Flow YAML → Gzip: 1,100 → 580 位元組(減少 47%)

壓縮後的 Block 與壓縮後的 Flow 之間的差異很小。

常見問題

壓縮後的 YAML 仍然是合法的 YAML 嗎?

是的。Flow 樣式的 YAML 完全合法,任何 YAML 解析器都能解析。它使用大括號表示映射,方括號表示序列——基本上是 YAML 內的類 JSON 語法。資料結構是相同的;只有格式不同。

應該壓縮 Kubernetes 清單的 YAML 嗎?

不應該。Kubernetes 清單應該保持可讀、受版本控制且易於編輯。如果需要減少傳輸大小,讓你的部署工具處理壓縮即可。Helm charts 和 Kustomize overlays 比壓縮更能有效管理 YAML 的複雜性。

相關資源

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