Which is Better YAML Parsing Libraries?
js-yaml vs yaml vs yamljs
1 Year
js-yamlyamlyamljsSimilar Packages:
What's YAML Parsing Libraries?

YAML parsing libraries are essential tools in web development for reading and writing YAML (YAML Ain't Markup Language) files, which are often used for configuration files due to their human-readable format. These libraries facilitate the conversion between YAML and JavaScript objects, enabling developers to easily manage configurations and data structures in their applications. Each library offers unique features and performance characteristics, making them suitable for different use cases and preferences in the development process.

NPM Package Downloads Trend
Github Stars Ranking
Stat Detail
Package
Downloads
Stars
Size
Issues
Publish
License
js-yaml96,038,3336,303-624 years agoMIT
yaml52,838,9031,297681 kB18a month agoISC
yamljs1,980,530887-537 years agoMIT
Feature Comparison: js-yaml vs yaml vs yamljs

Performance

  • js-yaml: js-yaml is known for its solid performance and is optimized for parsing and dumping YAML data. It strikes a balance between speed and functionality, making it suitable for most applications without sacrificing too much performance.
  • yaml: yaml is designed with performance in mind, offering faster parsing and stringifying capabilities compared to other libraries. It uses a streaming approach, which allows it to handle large YAML files efficiently without consuming excessive memory.
  • yamljs: yamljs provides reasonable performance but may not be as fast as yaml or js-yaml for large datasets. Its focus is more on usability and ease of integration into projects rather than raw speed.

Ease of Use

  • js-yaml: js-yaml has a straightforward API that is easy to understand and use, making it accessible for developers of all skill levels. Its documentation provides clear examples, which helps in quick adoption and implementation.
  • yaml: yaml offers a clean and simple API, making it easy to integrate into projects. Its modern design philosophy emphasizes developer experience, allowing for quick learning and efficient usage.
  • yamljs: yamljs is particularly user-friendly, with a minimalistic API that allows developers to quickly parse and stringify YAML data. Its simplicity makes it an excellent choice for beginners or those looking for a quick solution.

Features and Capabilities

  • js-yaml: js-yaml supports a wide range of YAML features, including complex data structures, custom types, and anchors. It also provides options for handling specific parsing scenarios, making it versatile for various use cases.
  • yaml: yaml supports advanced features like custom types and schema definitions, allowing for greater flexibility in how YAML data is handled. It also includes support for YAML 1.2, which introduces additional syntax and capabilities.
  • yamljs: yamljs supports basic YAML features and is particularly good for straightforward use cases. However, it may lack some of the advanced features found in js-yaml and yaml, making it less suitable for complex YAML structures.

Community and Support

  • js-yaml: js-yaml has a large user base and a strong community, which ensures ongoing support and regular updates. Its extensive documentation and active GitHub repository make it easy to find help and resources.
  • yaml: yaml is gaining popularity and has a growing community. While it may not have as extensive a support network as js-yaml, it is well-documented and actively maintained, ensuring developers can find assistance when needed.
  • yamljs: yamljs has a smaller community compared to js-yaml and yaml, which may result in fewer resources and examples available. However, it is still maintained and has enough documentation to support basic use cases.

Compatibility

  • js-yaml: js-yaml is compatible with both Node.js and browser environments, making it a versatile choice for various application types. It can be easily integrated into both server-side and client-side projects.
  • yaml: yaml is primarily designed for Node.js environments but can also be used in browser contexts with appropriate bundling. Its focus on performance makes it particularly suitable for server-side applications.
  • yamljs: yamljs works well in Node.js environments and can be used in the browser with some configuration. Its simplicity allows for easy integration into projects without complex setup.
How to Choose: js-yaml vs yaml vs yamljs
  • js-yaml: Choose js-yaml if you need a widely used, reliable library with a good balance of performance and features. It is well-documented and actively maintained, making it a solid choice for most applications that require YAML parsing.
  • yaml: Choose yaml if you are looking for a modern library that emphasizes performance and simplicity. It is designed to be fast and lightweight, making it suitable for applications where speed is critical, such as in serverless environments or microservices.
  • yamljs: Choose yamljs if you require a library that supports both YAML parsing and stringifying with a focus on ease of use. It is particularly useful for projects that need to manipulate YAML data directly in JavaScript without additional complexity.
README for js-yaml

JS-YAML - YAML 1.2 parser / writer for JavaScript

CI NPM version

Online Demo

This is an implementation of YAML, a human-friendly data serialization language. Started as PyYAML port, it was completely rewritten from scratch. Now it's very fast, and supports 1.2 spec.

Installation

YAML module for node.js

npm install js-yaml

CLI executable

If you want to inspect your YAML files from CLI, install js-yaml globally:

npm install -g js-yaml

Usage

usage: js-yaml [-h] [-v] [-c] [-t] file

Positional arguments:
  file           File with YAML document(s)

Optional arguments:
  -h, --help     Show this help message and exit.
  -v, --version  Show program's version number and exit.
  -c, --compact  Display errors in compact mode
  -t, --trace    Show stack trace on error

API

Here we cover the most 'useful' methods. If you need advanced details (creating your own tags), see examples for more info.

const yaml = require('js-yaml');
const fs   = require('fs');

// Get document, or throw exception on error
try {
  const doc = yaml.load(fs.readFileSync('/home/ixti/example.yml', 'utf8'));
  console.log(doc);
} catch (e) {
  console.log(e);
}

load (string [ , options ])

Parses string as single YAML document. Returns either a plain object, a string, a number, null or undefined, or throws YAMLException on error. By default, does not support regexps, functions and undefined.

options:

  • filename (default: null) - string to be used as a file path in error/warning messages.
  • onWarning (default: null) - function to call on warning messages. Loader will call this function with an instance of YAMLException for each warning.
  • schema (default: DEFAULT_SCHEMA) - specifies a schema to use.
    • FAILSAFE_SCHEMA - only strings, arrays and plain objects: http://www.yaml.org/spec/1.2/spec.html#id2802346
    • JSON_SCHEMA - all JSON-supported types: http://www.yaml.org/spec/1.2/spec.html#id2803231
    • CORE_SCHEMA - same as JSON_SCHEMA: http://www.yaml.org/spec/1.2/spec.html#id2804923
    • DEFAULT_SCHEMA - all supported YAML types.
  • json (default: false) - compatibility with JSON.parse behaviour. If true, then duplicate keys in a mapping will override values rather than throwing an error.

NOTE: This function does not understand multi-document sources, it throws exception on those.

NOTE: JS-YAML does not support schema-specific tag resolution restrictions. So, the JSON schema is not as strictly defined in the YAML specification. It allows numbers in any notation, use Null and NULL as null, etc. The core schema also has no such restrictions. It allows binary notation for integers.

loadAll (string [, iterator] [, options ])

Same as load(), but understands multi-document sources. Applies iterator to each document if specified, or returns array of documents.

const yaml = require('js-yaml');

yaml.loadAll(data, function (doc) {
  console.log(doc);
});

dump (object [ , options ])

Serializes object as a YAML document. Uses DEFAULT_SCHEMA, so it will throw an exception if you try to dump regexps or functions. However, you can disable exceptions by setting the skipInvalid option to true.

options:

  • indent (default: 2) - indentation width to use (in spaces).
  • noArrayIndent (default: false) - when true, will not add an indentation level to array elements
  • skipInvalid (default: false) - do not throw on invalid types (like function in the safe schema) and skip pairs and single values with such types.
  • flowLevel (default: -1) - specifies level of nesting, when to switch from block to flow style for collections. -1 means block style everwhere
  • styles - "tag" => "style" map. Each tag may have own set of styles.
  • schema (default: DEFAULT_SCHEMA) specifies a schema to use.
  • sortKeys (default: false) - if true, sort keys when dumping YAML. If a function, use the function to sort the keys.
  • lineWidth (default: 80) - set max line width. Set -1 for unlimited width.
  • noRefs (default: false) - if true, don't convert duplicate objects into references
  • noCompatMode (default: false) - if true don't try to be compatible with older yaml versions. Currently: don't quote "yes", "no" and so on, as required for YAML 1.1
  • condenseFlow (default: false) - if true flow sequences will be condensed, omitting the space between a, b. Eg. '[a,b]', and omitting the space between key: value and quoting the key. Eg. '{"a":b}' Can be useful when using yaml for pretty URL query params as spaces are %-encoded.
  • quotingType (' or ", default: ') - strings will be quoted using this quoting style. If you specify single quotes, double quotes will still be used for non-printable characters.
  • forceQuotes (default: false) - if true, all non-key strings will be quoted even if they normally don't need to.
  • replacer - callback function (key, value) called recursively on each key/value in source object (see replacer docs for JSON.stringify).

The following table show availlable styles (e.g. "canonical", "binary"...) available for each tag (.e.g. !!null, !!int ...). Yaml output is shown on the right side after => (default setting) or ->:

!!null
  "canonical"   -> "~"
  "lowercase"   => "null"
  "uppercase"   -> "NULL"
  "camelcase"   -> "Null"

!!int
  "binary"      -> "0b1", "0b101010", "0b1110001111010"
  "octal"       -> "0o1", "0o52", "0o16172"
  "decimal"     => "1", "42", "7290"
  "hexadecimal" -> "0x1", "0x2A", "0x1C7A"

!!bool
  "lowercase"   => "true", "false"
  "uppercase"   -> "TRUE", "FALSE"
  "camelcase"   -> "True", "False"

!!float
  "lowercase"   => ".nan", '.inf'
  "uppercase"   -> ".NAN", '.INF'
  "camelcase"   -> ".NaN", '.Inf'

Example:

dump(object, {
  'styles': {
    '!!null': 'canonical' // dump null as ~
  },
  'sortKeys': true        // sort object keys
});

Supported YAML types

The list of standard YAML tags and corresponding JavaScript types. See also YAML tag discussion and YAML types repository.

!!null ''                   # null
!!bool 'yes'                # bool
!!int '3...'                # number
!!float '3.14...'           # number
!!binary '...base64...'     # buffer
!!timestamp 'YYYY-...'      # date
!!omap [ ... ]              # array of key-value pairs
!!pairs [ ... ]             # array or array pairs
!!set { ... }               # array of objects with given keys and null values
!!str '...'                 # string
!!seq [ ... ]               # array
!!map { ... }               # object

JavaScript-specific tags

See js-yaml-js-types for extra types.

Caveats

Note, that you use arrays or objects as key in JS-YAML. JS does not allow objects or arrays as keys, and stringifies (by calling toString() method) them at the moment of adding them.

---
? [ foo, bar ]
: - baz
? { foo: bar }
: - baz
  - baz
{ "foo,bar": ["baz"], "[object Object]": ["baz", "baz"] }

Also, reading of properties on implicit block mapping keys is not supported yet. So, the following YAML document cannot be loaded.

&anchor foo:
  foo: bar
  *anchor: duplicate key
  baz: bat
  *anchor: duplicate key

js-yaml for enterprise

Available as part of the Tidelift Subscription

The maintainers of js-yaml and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. Learn more.