在 Node.js 中处理 YAML:js-yaml 和 yaml 库

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 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 yaml


js-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()); // 2025


yaml 库



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]); // "编程"

推荐