在 JavaScript (Node.js) 中处理 YAML
YAML(YAML Ain't Markup Language)是一种人类可读的数据序列化格式,常用于配置文件(例如 Docker Compose、Kubernetes、Ansible)。在 Node.js 生态系统中,有两个主要的库用于处理 YAML:js-yaml(最流行)和 yaml(现代,支持流式处理)。
在本文中,我们将探讨这两个库,学习如何将 YAML 解析为 JavaScript 对象,将对象序列化回 YAML,以及处理错误和操作文件。
安装库
首先,通过 npm 安装其中一个库:
# 安装 js-yaml(推荐用于大多数项目)npm install js-yaml
# 安装更现代的 yaml 库npm install yamljs-yaml 库
js-yaml 是 Node.js 中最成熟、使用最广泛的 YAML 处理库。它支持完整的 YAML 1.2 规范,包括复杂数据类型、标签和自定义模式。
解析 YAML 字符串
const yaml = require('js-yaml');
const yamlString = `server: host: localhost port: 8080 ssl: truedatabase: driver: postgresql host: db.example.com port: 5432 credentials: user: admin password: secret`;
try { const data = yaml.load(yamlString); console.log(data.server.host); // "localhost" console.log(data.database.credentials.user); // "admin"} catch (e) { console.error('YAML 解析错误:', e.message);}解析 YAML 文件
const fs = require('fs');const yaml = require('js-yaml');
try { const fileContents = fs.readFileSync('./config.yaml', 'utf8'); const data = yaml.load(fileContents); console.log(data);} catch (e) { console.error('文件读取错误:', e.message);}序列化为 YAML
const yaml = require('js-yaml');
const config = { app: { name: "MyApp", version: "1.0.0" }, features: { logging: true, cache: { ttl: 3600, type: "redis" } }};
const yamlString = yaml.dump(config, { indent: 2, // 2 个空格缩进 lineWidth: 80, // 最大行宽 noRefs: true, // 不使用引用 sortKeys: true // 对键排序});
console.log(yamlString);// 输出:// app:// name: MyApp// version: 1.0.0// features:// cache:// ttl: 3600// type: redis// logging: true使用自定义类型
js-yaml 支持自定义 YAML 标签来处理特殊数据类型:
const yaml = require('js-yaml');
// 为日期创建自定义类型const DateType = new yaml.Type('!date', { kind: 'scalar', resolve: (data) => data.match(/^\\d{4}-\\d{2}-\\d{2}$/), construct: (data) => new Date(data), instanceOf: Date, represent: (date) => date.toISOString().split('T')[0]});
// 创建包含自定义类型的模式const CUSTOM_SCHEMA = yaml.DEFAULT_SCHEMA.extend([DateType]);
const yamlString = `event: !date 2025-12-31name: "New Year Party"`;
const data = yaml.load(yamlString, { schema: CUSTOM_SCHEMA });console.log(data.event instanceof Date); // trueconsole.log(data.event.getFullYear()); // 2025yaml 库
yaml 是一个更现代的库,提供流式解析和更好的 Unicode 支持。它也实现了 YAML 1.2 规范。
基本解析
const YAML = require('yaml');
const doc = YAML.parse(`person: name: 伊万 age: 30 hobbies: - 编程 - 阅读`);
console.log(doc.person.name); // "伊万"console.log(doc.person.hobbies[0]); // "编程"