现代配置指南——yaml比json高级在哪

author author     2023-03-10     564

关键词:

参考技术A

一直以来,前端工程中的配置大多都是 .js 文件或者 .json 文件,最常见的比如:

这些配置对前端非常友好,因为都是我们熟悉的 JS 对象结构。一般静态化的配置会选择 json 文件,而动态化的配置,涉及到引入其他模块,因此会选择 js 文件。

还有现在许多新工具同时支持多种配置,比如 Eslint ,两种格式的配置任你选择:

后来不知道什么时候,突然出现了一种以 .yaml 或 .yml 为后缀的配置文件。一开始以为是某个程序的专有配置,后来发现这个后缀的文件出现的频率越来越高,甚至 Eslint 也支持了第三种格式的配置 .eslintrc.yml 。

既然遇到了,那就去 探索 它!

下面我们从 YAML 的 出现背景 使用场景 具体用法 高级操作 四个方面,看一下这个流行的现代化配置的神秘之处。

一个新工具的出现避免不了有两个原因:

YAML 这种新工具就属于后者。其实在 yaml 出现之前 js+json 用得也不错,也没什么特别难以处理的问题;但是 yaml 出现以后,开始觉得它好乱呀什么东西,后来了解它后,越用越喜欢,一个字就是优雅。

很多文章说选择 yaml 是因为 json 的各种问题,json 不适合做配置文件,这我觉得有些言过其实了。我更愿意将 yaml 看做是 json 的升级,因为 yaml 在格式简化和体验上表现确实不错,这个得承认。

下面我们对比 YAML 和 JSON,从两方面分析:

JSON 比较繁琐的地方是它严格的格式要求。比如这个对象:

在 JSON 中以下写法通通都是错的:

字符串的值必须 k->v 都是 "" 才行:

虽然是统一格式,但是使用上确实有不便利的地方。比如我在浏览器上测出了接口错误。然后把参数拷贝到 Postman 里调试,这时就我要手动给每个属性和值加 "" 号,非常繁琐。

YAML 则是另辟蹊径,直接把字符串符号干掉了。上面对象的同等 yaml 配置如下:

没错,就这么简单!

除了 "" 号,yaml 觉得 和 [] 这种符号也是多余的,不如一起干掉。

于是呢,以这个对象数组为例:

转换成 yaml 是这样的:

对比一下这个精简程度,有什么理由不爱它?

说起增加的部分,最值得一提的,是 YAML 支持了 注释 。

用 JSON 写配置是不能有注释的,这就意味着我们的配置不会有备注,配置多了会非常凌乱,这是最不人性化的地方。

现在 yaml 支持了备注,以后配置可以是这样的:

把这种配置丢给新同事,还怕他看不懂配了啥吗?

除注释外,还支持配置复用的相关功能,这个后面说。

我接触的第一个 yaml 配置是 Flutter 项目的包管理文件 pubspec.yaml ,这个文件的作用和前端项目中的 package.json 一样,用于存放一些全局配置和应用依赖的包和版本。

看一下它的基本结构:

你看这个结构和 package.json 是不是基本一致? dependencies 下列出应用依赖和版本, dev_dependencies 下的则是开发依赖。

后来在做 CI/CD 自动化部署的时候,我们用到了 GitHub Action。它需要多个 yaml 文件来定义不同的工作流,这个配置可比 flutter 复杂得多。

其实不光 GitHub Action,其他流行的类似的构建工具如 GitLab CI/CD,circleci,全部都是齐刷刷的 yaml 配置,因此如果你的项目要做 CI/CD 持续集成,不懂 yaml 语法肯定是不行的。

还有,接触过 Docker 的同学肯定知道 Docker Compose,它是 Docker 官方的单机编排工具,其配置文件 docker-compose.yml 也是妥妥的 yaml 格式。现在 Docker 正是如日中天的时候,使用 Docker 必然免不了编排,因此 yaml 语法早晚也要攻克。

上面说的这 3 个案例,几乎都是现代最新最流行的框架/工具。从它们身上可以看出来,yaml 必然是下一代配置文件的标准,并且是 前端-后端-运维 的通用标准。

说了这么多,你跃跃欲试了吗?下面我们详细介绍 yaml 语法。

介绍 yaml 语法会对比 json 解释,以便我们快速理解。

先看一下 yaml 的几个特点:

相比于 JSON 来说,最大的区别是用 缩进 来表示层级,这个和 Python 非常接近。还有强化的一点是支持了注释,JSON 默认是不支持的(虽然 TS 支持),这也对配置文件非常重要。

YAML 支持以下几种数据结构:

先看对象,上一个 json 例子:

转换成 yaml:

对象是最核心的结构,key 值的表示方法是 [key]: ,注意这里 冒号后面有个空格,一定不能少 。value 的值就是一个 纯量 ,且默认不需要引号。

数组和对象的结构差不多,区别是在 key 前用一个 - 符号标识这个是数组项。注意这里 也有一个空格 ,同样也不能少。

转换成 JSON 格式如下:

了解了基本的对象和数组,我们再来看一个复杂的结构。

众所周知,在实际项目配置中很少有简单的对象或数组,大多都是对象和数组相互嵌套而成。在 js 中我们称之为对象数组,而在 yaml 中我们叫 复合结构 。

比如这样一个稍复杂的 JSON:

转换成复合结构的 YAML:

若你想尝试更复杂结构的转换,可以在 这个 网页中在线实践。

纯量比较简单,对应的就是 js 的基本数据类型,支持如下:

比较特殊的两个,null 用 ~ 符号表示,时间大多用 2021-12-21 这种格式表示,如:

转换成 JS 后:

在 yaml 实战过程中,遇到过一些特殊场景,可能需要一些特殊的处理。

在 shell 中我们常见到一些参数很多,然后特别长的命令,如果命令都写在一行的话可读性会非常差。

假设下面的是一条长命令:

在 linux 中可以这样处理:

就是在每行后加 符号标识换行。然而在 YAML 中更简单,不需要加任何符号,直接换行即可:

YAML 默认会把换行符转换成 空格 ,因此转换后 JSON 如下,正是我们需要的:

然而有时候,我们的需求是 保留换行符 ,并不是把它转换成空格,又该怎么办呢?

这个也简单,只需要在首行加一个 | 符号:

转换成 JSON 变成了这样:

获取配置是指,在 YAML 文件中定义的某个配置,如何在代码(JS)里获取?

比如前端在 package.json 里有一个 version 的配置项表示应用版本,我们要在代码中获取版本,可以这么写:

JSON 是可以直接导入的,YAML 可就不行了,那怎么办呢?我们分环境解析:

在浏览器中

浏览器中代码用 webapck 打包,因此加一个 loader 即可:

然后配置 loader:

在组件中使用:

在 Node.js 中

Node.js 环境下没有 Webpack,因此读取 yaml 配置的方法也不一样。

首先安装一个 js-yaml 模块:

然后通过模块提供的方法获取:

配置项复用的意思是,对于定义过的配置,在后面的配置直接引用,而不是再写一遍,从而达到复用的目的。

YAML 中将定义的复用项称为锚点,用 & 标识;引用锚点则用 * 标识。

对应的 JSON 如下:

但是锚点有个弊端,就是不能作为 变量 在字符串中使用。比如:

此时 key2 的值就是普通字符串 _my name is *name_,引用变得无效了。

其实在实际开发中,字符串中使用变量还是很常见的。比如在复杂的命令中多次使用某个路径,这个时候这个路径就应该是一个变量,在多个命令中复用。

GitHub Action 中有这样的支持,定义一个环境变量,然后在其他的地方复用:

这种实现方式与 webpack 中使用环境变量类似,在构建的时候将变量替换成对应的字符串。

如果本文对你有启发,请甩手一个赞



python基础10--yaml文件的写法与使用

参考技术Ayaml是专门用来写配置文件的语言yaml文件其实也是一种配置文件类型,后缀名是.yaml或.yml都可以个人认为比yaml比json格式更方便cmd执行pipinstallpyyaml装的时候要用pyyaml,实际使用时直接importyaml即可短横线加一个空格(-)... 查看详情

互联网企业安全高级指南读书笔记之入侵感知体系

...解析/检测规则三个方面的功能扩展MozillaInvestiGator具备了现代HIDS架构的雏形,但是整体上MIG偏向事后的取证 查看详情

yaml语言(代码片段)

1.YAML介绍YAML:以数据为中心,比JSON,XML更适合做配置文件;//示例:server:port:8081//此处有空格2.YAML基本语法使用缩进表示层级关系;缩进时,不允许使用Tab键,只允许使用空格;缩进的空格数目不重要,只有相同层级的元素左侧对齐即可;大小... 查看详情

springboot中yaml文件配置属性

参考技术A首先,在SpringBoot中,有两种配置文件的方式。一种是application.properties,另一种application.yaml(或者是application.yml)。yaml文件格式是SpringBoot支持的一种JSON超集文件格式,相对于传统的Properties配置文件,yaml文件以数据为核... 查看详情

现代前端库开发指南系列:使用webpack构建一个库(代码片段)

前言在前文中,我说过本系列文章的受众是在现代前端体系下能够熟练编写业务代码的同学,因此本文在介绍webpack配置时,仅提及构建一个库所特有的配置,其余配置请参考webpack官方文档。输出产物构建一个库与构建一个一般... 查看详情

spark性能优化指南——高级篇

Spark性能优化指南——高级篇[TOC]前言继基础篇讲解了每个Spark开发人员都必须熟知的开发调优与资源调优之后,本文作为《Spark性能优化指南》的高级篇,将深入分析数据倾斜调优与shuffle调优,以解决更加棘手的性能问题。数据... 查看详情

python3shevel模块,更高级的json序列化数据类型模块(比pickle更高级)

直接将数据类型以字典的格式存到文件中去。直接.get读取出来,  查看详情

《现代命令行工具指南》16.历史记录:智能化搜索你的历史记录-mcfly(代码片段)

​好工具就是生产力,这是专栏《现代命令行工具指南》精讲的第16个命令行工具,欢迎品鉴。人过留名,雁过留声。命令执行过后,也会留下记录,以便于再次执行。怎么查看历史记录呢?我们通常会用ctrl+r进行反向搜索,也... 查看详情

《现代命令行工具指南》16.历史记录:智能化搜索你的历史记录-mcfly(代码片段)

​好工具就是生产力,这是专栏《现代命令行工具指南》精讲的第16个命令行工具,欢迎品鉴。人过留名,雁过留声。命令执行过后,也会留下记录,以便于再次执行。怎么查看历史记录呢?我们通常会用ctrl+r进行反向搜索,也... 查看详情

《现代命令行工具指南》16.历史记录:智能化搜索你的历史记录-mcfly(代码片段)

​好工具就是生产力,这是专栏《现代命令行工具指南》精讲的第16个命令行工具,欢迎品鉴。人过留名,雁过留声。命令执行过后,也会留下记录,以便于再次执行。怎么查看历史记录呢?我们通常会用ctrl+r进行反向搜索,也... 查看详情

spark性能优化指南——高级篇

...知的开发调优与资源调优之后,本文作为《Spark性能优化指南》的高级篇,将深入分析数据倾斜调优与shuffle调优,以解决更加棘手的性能问题。数据倾斜调优调优概述有的时候,我们可能会遇到大数据计算中一个最棘手的问题—... 查看详情

超越xml和json:yaml,java开发人员的新选择

...写)文件格式(使用Rubyonrails框架进行讲解因为它所有的配置文件都是使用的YAML)以及它与XML和JSON的区别最后讨论了YAML的优势和缺点  空格缩进和JSON选项  YAML文件格式主要集中于空格缩进的概念它用于指出数据的层次结... 查看详情

超越xml和json:yam

...写)文件格式(使用Rubyonrails框架进行讲解因为它所有的配置文件都是使用的YAML)以及它与XML和JSON的区别最后讨论了YAML的优势和缺点  空格缩进和JSON选项  YAML文件格式主要集中于空格缩进的概念它用于指出数据的层次结... 查看详情

kubernetes之yaml文件详解(汇总-详细)(代码片段)

...ml文件详解(汇总-详细) 一、YAML基础YAML是专门用来写配置文件的语言,非常简洁和强大,使用比json更方便。它实质上是一种通用的数据串行化格式。YAML语法规则: 大小写敏感使用缩进表示层级关系缩进时不允许使用Tal... 查看详情

微服务从0开始springcloud——比xml更适合的配置文件yaml(代码片段)

...务,一起学习一起进步。👀本期介绍主要介绍Yaml配置文件文章目录👀专栏介绍👀本期介绍YAMLYAML简介YAML常用写法普通值(字面量)对象(属性和值)、Map(键值对)数组、list、set复合结构YAML组织结构YAMLSpringBoot提供了... 查看详情

springboot配置

一、配置文件1、SpringBoot使用一个全局的配置文件,配置文件名是固定的   application.properties:配置文件的作用:修改SpringBoot自动配置的默认值;   application.yml:标记语言,以数据为中心,比json、xml等更适合... 查看详情

dockerregistry使用指南

...y或harbor。本文简单介绍一下dockerregistry的搭建使用及常用配置。搭建registry最基础的命令为:dockerrun-d-v/data/registry:/var/lib/registry-p5000:5000registry:2registry定义的对外服务端口为5000,我们也可以通过环境变量REGISTRY_HTTP_ADDR来修改服务... 查看详情

《现代命令行工具指南》17.管理node.js:快速简单的node.js版本管理器-fnm(代码片段)

​好工具就是生产力,这是专栏《现代命令行工具指南》精讲的第17个命令行工具,欢迎品鉴。管理不同版本的Node.js有很多工具,比如:NVM、N等等,有一款声称比NVM快40倍的管理工具,想知道是什么吗?这就是本文的主角:fnm。... 查看详情