--- title: 如何使用 frontmatter createTime: 2024/09/18 09:19:36 permalink: /article/ecxnxxd0/ --- ::: info 说明 本文 翻译 [Introduction to YAML](https://dev.to/paulasantamaria/introduction-to-yaml-125f) 的部分内容。 用于简单说明如何在 markdown 文件中使用 frontmatter。 如果您具有良好的英语阅读基础,为避免翻译可能存在的内容失真,建议您阅读原文。 原文地址: 。 ::: ## 介绍 YAML 是一种数据序列化语言,通常用于配置文件,例如 [Open API 规范](https://github.com/OAI/OpenAPI-Specification/blob/master/examples/v2.0/yaml/api-with-examples.yaml) 或 [CI/CD 管道](https://docs.gitlab.com/ee/ci/yaml/)。 ::: note 有趣的事实!🤓 根据 [YAML 1.0 规范文档 (2001-05-26)](https://yaml.org/spec/history/2001-05-26.html) 首字母缩略词 “YAML” 代表 “Yet Another Markup Language”, 但后来在 [2002-04-07 规范](https://yaml.org/spec/history/2002-04-07.html) 中更改为递归首字母缩略词“YAML Ain't Markup Language”。 ::: 正如最新规范中所述,__YAML__ 旨在 __对处理数据的人友好__,并通过 __最大限度地减少结构字符的使用来实现“独特的干净度”__, 允许数据以自然和有意义的方式显示。 最新规范还指出,YAML _1.2 作为官方子集符合 JSON_ ,这意味着大多数 JSON 文档都可以解析为 YAML。 YAML 通过使用基于缩进的范围界定(类似于 Python)轻松检查数据结构。 ::: note 另一个有趣的事实!🤓 DEV.to 文章使用 YAML 来定义自定义变量,如标题、描述、标签等。 ::: ## 基本语法 YAML 文档基本上是 __键值对的集合__,其中值可以像字符串一样简单,也可以像树一样复杂。 以下是有关 YAML 语法的一些说明: - __缩进用于表示结构__。不允许使用制表符,只要子节点的缩进量比父节点大,空格的数量就无关紧要。 - 允许使用 UTF-8、UTF-16 和 UTF-32 编码。 ### 字符串 ```md --- # 字符串不需要引号: title: Introduction to YAML # 但你仍可使用它们: title-w-quotes: 'Introduction to YAML' # 多行字符串以 | 开头 execute: | npm ci npm build npm test --- ``` 上面的代码将转换为 JSON 为: ```json { "title": "Introduction to YAML", "title-w-quotes": "Introduction to YAML", "execute": "npm ci\nnpm build\nnpm test\n" } ``` ### 数字 ```md --- # 整数: age: 29 # 浮点数: price: 15.99 # 科学计数法: population: 2.89e+6 --- ``` 上面的代码将转换为 JSON 为: ```json { "age": 29, "price": 15.99, "population": 2890000 } ``` ### 布尔值 ```md --- # 布尔值可以有不同的表示方式: published: false published: False published: FALSE --- ``` 以上所有内容都将转换为 JSON,如下所示: ```json { "published": false } ``` ### Null 值 ```md --- # Null 值可以通过不设置值来表示: null-value: # 或者更明确地说: null-value: null null-value: NULL null-value: Null --- ``` 以上所有内容都将转换为 JSON,如下所示: ```json { "null-value": null } ``` ### 日期和时间戳 可以使用 ISO 格式的日期,如下所示: ```md --- date: 2002-12-14 canonical: 2001-12-15T02:59:43.1Z iso8601: 2001-12-14t21:59:43.10-05:00 spaced: 2001-12-14 21:59:43.10 -5 --- ``` ### Sequences 序列 序列允许我们在 YAML 中定义列表: ```md --- # 使用连字符的数字列表: numbers: - one - two - three # 内联版本: numbers: [ one, two, three ] --- ``` 上述两个序列都将解析为 JSON,如下所示: ```json { "numbers": [ "one", "two", "three" ] } ``` ### 嵌套值 我们可以使用上述所有类型来创建具有嵌套值的对象,如下所示: ```md --- # 一九八四小说数据。 nineteen-eighty-four: author: George Orwell published-at: 1949-06-08 page-count: 328 description: | A Novel, often published as 1984, is a dystopian novel by English novelist George Orwell. It was published in June 1949 by Secker & Warburg as Orwell's ninth and final book. --- ``` 这将转换为 JSON : ```json { "nineteen-eighty-four": { "author": "George Orwell", "published-at": "1949-06-08T00:00:00.000Z", "page-count": 328, "description": "A Novel, often published as 1984, is a dystopian novel by English novelist George Orwell.\nIt was published in June 1949 by Secker & Warburg as Orwell's ninth and final book.\n" } } ``` ### 对象列表 将序列和嵌套值组合在一起,我们可以创建一个对象列表。 ```md --- # Let's list books: - nineteen-eighty-four: author: George Orwell published-at: 1949-06-08 page-count: 328 description: | A Novel, often published as 1984, is a dystopian novel by English novelist George Orwell. - the-hobbit: author: J. R. R. Tolkien published-at: 1937-09-21 page-count: 310 description: | The Hobbit, or There and Back Again is a children's fantasy novel by English author J. R. R. Tolkien. --- ``` ## 独特特性 以下是一些引起我注意的 __更复杂的功能__ ,它们也使 YAML 与 JSON 区分开来。 ### 注释 你可能已经在我前面的示例中注意到,YAML 允许以 `#` 开头的注释。 ```md --- # 这是一个非常有用的注释。 --- ``` ### 锚点的可重用性 节点锚点用于 __标记一个节点__ 以供将来引用,从而允许我们重复使用该节点。 要标记一个节点,我们使用 `&` 字符,要引用它,我们使用 `*` : 在下面的示例中,我们将定义一个书籍列表并重用作者数据,因此我们只需要定义一次: ```md --- # 作者数据: author: &gOrwell name: George last-name: Orwell # 一些书籍: books: - 1984: author: *gOrwell - animal-farm: author: *gOrwell --- ``` 解析为 JSON 后,上面的代码将如下所示: ```json { "author": { "name": "George", "last-name": "Orwell" }, "books": [ { "1984": { "author": { "name": "George", "last-name": "Orwell" } } }, { "animal-farm": { "author": { "name": "George", "last-name": "Orwell" } } } ] } ``` ### 带有标签的显式数据类型 正如我们在之前的示例中所见,YAML 会自动检测我们值的类型,但我们也可以 __指定所需的类型__ 。 我们通过在值前加上 `!!` 类型来指定它。 以下是一些示例: ```md --- # 以下值应为整数,无论何种情况: should-be-int: !!int 3.2 # 解析任何值为字符串: should-be-string: !!str 30.25 # 我需要下一个值为布尔类型: should-be-boolean: !!bool yes --- ``` 这将转换为 JSON: ```json { "should-be-int": 3, "should-be-string": "30.25", "should-be-boolean": true } ```