在 JavaScript (Node.js) 中使用 YAML:完整指南
YAML(YAML Ain't Markup Language)是一种人类可读的数据序列化格式,广泛用于配置文件、API 描述、CI/CD 流水线和数据交换。在 Node.js 生态系统中,有几个强大的库可用于处理 YAML。本文将详细介绍主要工具、它们的功能以及使用示例。
Node.js 中流行的 YAML 库
在 Node.js 环境中,最常用的 YAML 库包括:
- js-yaml — 最流行且维护最活跃的库。支持全套操作:解析、序列化、自定义模式和类型。
- yaml(yaml 包) — 现代替代方案,支持严格解析、注释和 AST(抽象语法树)。
- yamljs — 轻量级库,API 简单,适合基本任务。
安装 js-yaml 库
要开始在 Node.js 中使用 YAML,请通过 npm 安装该库:
npm install js-yaml安装后,将库导入到您的项目中:
const yaml = require('js-yaml');const fs = require('fs');将 YAML 解析为 JavaScript 对象
基本操作是将 YAML 字符串转换为 JavaScript 对象:
const yamlString = `server: host: localhost port: 8080 ssl: truedatabases: - name: users type: postgres - name: logs type: mongodb`;
try { const data = yaml.load(yamlString); console.log(data.server.host); // "localhost" console.log(data.databases[0].name); // "users"} catch (e) { console.error('YAML 解析错误:', e.message);}yaml.load() 方法可以安全地将 YAML 字符串转换为对象。要从文件加载,请使用:
try { const config = yaml.load(fs.readFileSync('config.yaml', 'utf8')); console.log(config);} catch (e) { console.error('读取配置错误:', e);}将 JavaScript 对象序列化为 YAML
反向操作是将对象转换为 YAML 字符串:
const configObject = { app: { name: "MyApp", version: "1.0.0" }, features: ["auth", "logging", "analytics"], database: { host: "db.example.com", port: 5432 }};
const yamlString = yaml.dump(configObject, { indent: 2, lineWidth: 120, noRefs: true});
console.log(yamlString);// 输出:// app:// name: MyApp// version: 1.0.0// features:// - auth// - logging// - analytics// database:// host: db.example.com// port: 5432yaml.dump() 方法的参数:
indent— 缩进的空格数(默认为 2)lineWidth— 最大行长度(默认为 80)noRefs— 禁用锚点和引用skipInvalid— 跳过无效值而不是抛出错误
使用自定义 YAML 类型
js-yaml 支持自定义模式和数据类型。例如,可以添加对日期的支持:
const yaml = require('js-yaml');
// 创建支持日期的自定义模式const schema = yaml.DEFAULT_SCHEMA.extend([ new yaml.Type('tag:yaml.org,2002:timestamp', { kind: 'scalar', resolve: (data) => { return !isNaN(Date.parse(data)); }, construct: (data) => { return new Date(data); }, instanceOf: Date, represent: (date) => { return date.toISOString(); } })]);
const yamlString = 'event_date: 2024-03-15T14:30:00Z';const parsed = yaml.load(yamlString, { schema });console.log(parsed.event_date inst