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 的複雜性。
相關資源
- YAML 格式化工具 — 格式化或壓縮 YAML 檔案
- YAML 語法教學 — 了解 Block 與 Flow 樣式
- JSON 轉 YAML 轉換 — 在格式之間轉換