العمل مع YAML في JavaScript (Node.js)
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
# تثبيت المكتبة الأحدث yamlnpm install yamlمكتبة js-yaml
js-yaml هي المكتبة الأكثر نضجًا واستخدامًا واسعًا للعمل مع YAML في Node.js. وهي تدعم مواصفات YAML 1.2 الكاملة، بما في ذلك أنواع البيانات المعقدة والعلامات (Tags) والمخططات (Schemas) المخصصة.
تحليل سلسلة 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, // مسافة بادئة بمقدار فراغين 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 هي مكتبة أحدث، تقدم تحليلًا تدفقيًا (Streaming Parsing) ودعمًا أفضل لـ 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]); // "برمجة"