使用json、yaml阱飘、toml作為配置文件,你知道他們的區(qū)別嗎

前言

配置文件虱颗,不言而喻沥匈,主要是我們進(jìn)行項目和工程配置的文件。

如果是站在前端角度說的話忘渔,我們最常接觸的就是 json以及 js類型的文件高帖,這種形式的配置寫法對前端非常友好,因?yàn)槎际俏覀兪煜さ?JS 對象結(jié)構(gòu)畦粮,如:

  • package.json
  • webpack.config.js
  • babel.config.js
  • vue.config.js

不過散址,隨著技術(shù)的更新迭代,也涌現(xiàn)出一些新的配置文件格式宣赔,相比較而言预麸,原有的文件格式好像也變得不是那么好用了。雖然在此之前儒将,json+js用著也不錯吏祸,不過,當(dāng)新的工具出現(xiàn)后钩蚊,尤其是在你深度體驗(yàn)與使用之后贡翘,可能會發(fā)現(xiàn)事情似乎有點(diǎn)那么不一樣了蹈矮,感覺新的玩意就是好啊??,也便開始嫌棄之前的家伙了~

不過鸣驱,我們要站在不同角度思考問題泛鸟,從新工具誕生的角度看,其誕生必然有著一定的歷史背景存在踊东,如:

  1. 舊工具在某些場景表現(xiàn)吃力北滥,需要更優(yōu)的替代方案
  2. 舊的寫法和模式在某些場景下有著明顯的短板和缺陷,需要更進(jìn)一步的完善方案

背景

最近在做開源項目的時候递胧,在開發(fā)功能時碑韵,考慮到不同場景、不同用戶的不同需求缎脾,在開始設(shè)計功能時就考慮到預(yù)留一定的可定制窗口方便用戶進(jìn)行定制化配置祝闻。當(dāng)然,在功能不斷開發(fā)進(jìn)行時遗菠,以及后期的迭代拓展時联喘,都會源源不斷的誕生出各種小功能和定制需求,因此辙纬,對于擁有一個足夠簡單豁遭、易用、拓展的配置文件是相當(dāng)有必要的贺拣。

它應(yīng)該具備以下基本能力:

  1. 支持注釋:對于配置文件來說蓖谢,注釋的重要性不必多說,它需要描述每個配置字段的作用
  2. 足夠簡單:語法足夠簡單譬涡,用法足夠簡單闪幽,上手足夠簡單;至少保證新人能很快上手使用
  3. 方便讀寫:對于用戶來說涡匀,應(yīng)該是可讀性非常高的盯腌,符合人類語言習(xí)慣的,概覽之后可以快速上手配置

在此之前的版本陨瘩,我已經(jīng)針對該想法做了初步的實(shí)施落地腕够,從個人經(jīng)驗(yàn)來說,我之前在搞 CI/CD 自動化部署相關(guān)的東西時舌劳,寫過一些 github action(配置文件為yaml格式)帚湘,因此,對于yaml語法算是有些了解甚淡。

從使用感受上來說客们,它語法更簡潔支持注釋,所以底挫,我果斷選擇了yaml作為我對于項目的配置文件格式恒傻。

不過,在這段時間的使用過程中建邓,我也發(fā)現(xiàn)了yaml存在的一些問題盈厘,因此,最近我又重新思考了一下下這個問題:

  1. 是繼續(xù)按照傳統(tǒng)的js文件的對象寫法呢官边?
  2. 還是繼續(xù)使用yaml作為配置文件使用呢沸手?
  3. 還是進(jìn)一步研究一些其他類型的配置文件呢?
  4. 這些配置文件類型又有啥本質(zhì)區(qū)別呢注簿?

抱著學(xué)習(xí)的心理契吉,咱不能在遇到問題的時候就選擇逃避呀,那么本篇文章也算是對不同類型配置文件的一種研究和學(xué)習(xí)了诡渴。

簡單介紹

JSON

JSON的定義一般是作為數(shù)據(jù)格式捐晶,它通常用于序列化、結(jié)構(gòu)化數(shù)據(jù)并通過網(wǎng)絡(luò)進(jìn)行交換妄辩,通常發(fā)生在服務(wù)器與 Web 應(yīng)用之間惑灵。不過也有很多工具將其作為配置文件使用。

JSON 其實(shí)完全可以當(dāng)成是 JS 對象的形式進(jìn)行理解眼耀、使用英支。

其實(shí)使用JSON作為配置文件也有其一定的優(yōu)勢:

  1. 語法非常簡單,純粹的鍵值對結(jié)構(gòu)
  2. 很多編程語言的標(biāo)準(zhǔn)庫都支持 JSON哮伟,比如:在JS當(dāng)中你可以直接引入讀取
  3. 現(xiàn)在幾乎所有的工具都提供 JSON 支持干花,包括語法突出顯示、自動格式化楞黄、驗(yàn)證工具等池凄。
  4. 采用人類可讀的輕量級文本,只需更少的編碼谅辣,處理速度更快

但是,也因?yàn)槠洫?dú)特的定位婶恼,它天生就注定了并不適合作為配置文件使用桑阶,原因也很明顯:

  1. 不支持注釋:對于配置文件來說,注釋的重要性不言而喻勾邦,但是JSON不支持添加注釋(JSON 作為一種數(shù)據(jù)交換格式蚣录,也不需要注釋??)
  2. 語法過于嚴(yán)格:鍵和字符串必須使用""雙引號(其實(shí)對于鍵來說,并不需要使用引號)眷篇,結(jié)尾不允許有逗號(除了結(jié)尾都必須有逗號萎河,哈哈~)
  3. 多余的最外層大括號:作為配置文件來說,最外層的大括號也顯得有些多余(這也是其作為交換數(shù)據(jù)格式的特點(diǎn),為了界定不同的對象)

雖然大家都很熟悉了虐杯,我們還是按流程看下基本用法玛歌,方便接下來做對比,如下:

{
  "name": "cat",
  "desc": {
    "color": "orange",
    "age": 1
  }
}

可以看出JSON作為數(shù)據(jù)格式擎椰,還是比較合適且優(yōu)秀的支子,但是作為配置文件來說,總覺得是力氣使錯了方向??

YAML

YAML 是一種數(shù)據(jù)序列化語言达舒,通常用于編寫配置文件(它的流行和 k8s 脫不了關(guān)系??~)值朋。

語法規(guī)則:

  • 大小寫敏感
  • 使用縮進(jìn)表示層級關(guān)系
  • 縮進(jìn)時不允許使用Tab鍵,只允許使用空格巩搏。
  • 縮進(jìn)的空格數(shù)目不重要昨登,只要相同層級的元素左側(cè)對齊即可
  • # 表示注釋,從這個字符一直到行尾贯底,都會被解析器忽略丰辣。
  • 文件拓展名為 .yaml.yml

支持的數(shù)據(jù)格式:

  • 對象:鍵值對的集合丈甸,又稱為映射/ 哈希 / 字典
  • 數(shù)組:一組按次序排列的值糯俗,又稱為序列 / 列表
  • 純量:單個的、不可再分的值睦擂,可以理解為基本類型

以下數(shù)據(jù)類型都屬于 JavaScript 的純量:

字符串得湘、布爾值、整數(shù)顿仇、浮點(diǎn)數(shù)淘正、Null、時間臼闻、日期

其特點(diǎn)如下:

  1. 有更好的可讀性鸿吆,對用戶更友好
  2. 簡潔和強(qiáng)大,寫法簡潔述呐,也有復(fù)雜的語法支持不同功能
  3. 是JSON的超集惩淳,JSON 文件在 YAML 中有效
  4. 使用 Python 風(fēng)格的縮進(jìn)來表示嵌套

如果說到缺點(diǎn)的話,那和它的特點(diǎn)也是密不可分的

  1. 因?yàn)椴皇窃С值母袷脚野幔煌脚_需要專門的解析工具(如:在JS中使用需要使用js-yaml解析思犁,在線轉(zhuǎn)換
  2. 簡單使用,基本語法夠簡單进肯;但是進(jìn)階使用激蹲,語法就比較復(fù)雜了,對于多行字符串的處理也有待優(yōu)化江掩,尤其是結(jié)合縮進(jìn)語法一起
  3. 縮進(jìn)語法学辱,如果搞錯了縮進(jìn)或者沒看清乘瓤,夠你定位問題的了

按慣例,看下基本用法:

# 我是注釋
name: cat
desc:
  color: orange
  age: 1
  date: 2022-09-01 16:10:01

同時上面的內(nèi)容也可以這樣寫:

name: cat
desc: { color: orange, age: 1, date: 2022-09-01 16:10:01 } # JSON的超集

轉(zhuǎn)為JS如下:

{ 
  name: 'cat', 
  desc: { 
    color: 'orange', 
    age: 1,
    date: 'Fri Sep 02 2022 00:10:01 GMT+0800 (中國標(biāo)準(zhǔn)時間)' // new Date
  } 
}

TOML

全稱 Tom's Obvious, Minimal Language策泣,意為語義明顯的衙傀、配置最小化的的語言。

官方描述:

為人而生的配置文件格式(好屌的感覺??~)着降。

TOML 旨在成為一個語義明顯且易于閱讀的最小化配置文件格式差油。TOML 被設(shè)計成可以無歧義地映射為哈希表。TOML 應(yīng)該能很容易地被解析成各種語言中的數(shù)據(jù)結(jié)構(gòu)任洞。

  1. TOML 以人為先
    • 語義明顯易于閱讀
    • 能無歧義地映射為哈希表
    • 易于解析成各種語言中的數(shù)據(jù)結(jié)構(gòu)
  2. TOML 具備實(shí)用的原生類型
    • 鍵/值對
    • 數(shù)組
    • 內(nèi)聯(lián)表
    • 表數(shù)組
    • 整數(shù) & 浮點(diǎn)數(shù)
    • 布爾值
    • 日期 & 時刻蓄喇,帶可選的時區(qū)偏移
  3. TOML 受到廣泛支持
    • TOML 已經(jīng)擁有大多數(shù)當(dāng)今使用的最流行的編程語言的實(shí)現(xiàn):C、C#交掏、C++妆偏、Clojure、Dart盅弛、Elixir钱骂、Erlang、Go挪鹏、Haskell见秽、Java、Javascript讨盒、Lua解取、Objective-C、Perl返顺、PHP禀苦、Python、Ruby遂鹊、Swift振乏、Scala……以及更多。

語法規(guī)則:

  • 大小寫敏感
  • 文件必須是合法的 UTF-8 編碼的 Unicode 文檔
  • 簡潔秉扑、清晰的 = 寫法(name = "cat"
  • 字符串需要由引號(")包裹
  • 表寫法慧邮,鍵值對的集合,由表頭定義舟陆,連同方括號作為單獨(dú)的行出現(xiàn)
  • # 表示注釋
  • 文件拓展名為 .toml

其特點(diǎn)如下:

  1. 寫法符合直覺误澳、簡單清晰
  2. 鍵名寫法強(qiáng)大,鍵名可以是裸露的吨娜,引號引起來的脓匿,或點(diǎn)分隔的淘钟。
  3. 對字符串支持完善宦赠,基本字符串陪毡、多行基本字符串、字面量和多行字面量
  4. 表寫法功能強(qiáng)大勾扭,鍵值對毡琉、數(shù)組、嵌套寫法等

缺點(diǎn):

  1. 不是原生支持的格式妙色,不同平臺需要專門的解析工具(如:在JS中使用需要使用@ltd/j-toml解析桅滋,在線轉(zhuǎn)換
  2. 屬于比較新型的格式,社區(qū)認(rèn)知度不高
  3. 新人對核心語法“表”需要適應(yīng)

基本用法如下:

# 我是注釋
name = "cat"

[desc]
color = "orange" 
age = 1 
date = 2022-09-01 16:10:01

你也可以這樣寫:

name = "cat"

desc.color = "orange" 
desc.age = 1 
desc.date = 2022-09-01 16:10:01

轉(zhuǎn)為JS如下:

{ 
  name: 'cat', 
  desc: { 
    color: 'orange', 
    age: 1身辨,
    date: '2022-09-01T16:10:01'
  } 
}

用法對比

其實(shí)站在配置文件的角度思考丐谋,我們最關(guān)心的就是鍵值對寫法(一個屬性控制一個功能點(diǎn)),誰能做到在使用時讀寫更方便煌珊,誰也就更具有優(yōu)勢号俐。

基本上就是一個對象結(jié)構(gòu),數(shù)據(jù)類型符合字符串定庵、對象吏饿、數(shù)組、布爾值蔬浙、日期猪落、數(shù)值也就差不多了

{ 
  "key" : value // 這里的 value 應(yīng)可以是以上的任何類型
}

字符串

1?? 簡單字符串用法

  • json寫法:

    { 
      "name" : "cat"
    }
    

    最外層花括號 {} 不可缺少,且不主持添加注釋畴博,keyvalue 都需要使用引號 "" 進(jìn)行包裹

  • yaml寫法:

    name: cat # 貓
    

    默認(rèn)不需要使用引號 "" 進(jìn)行包裹(用引號包裹結(jié)果也是一樣的)笨忌,簡單字符串使用非常簡單,對于多行字符串則有所不同绎晃。

    特別注意的是:冒號 : 后面要有空格蜜唾,這符合 yaml 后面的所有語法規(guī)范

  • toml寫法:

    name = "cat"
    

    有沒有空格無所謂,不影響解析庶艾,value部分需要按照字符串的寫法袁余,使用引號 "" 進(jìn)行包裹

2?? 多行字符串

有些場景我們可能會定義很長的一段字符串,默認(rèn)展示肯定是在一行顯示的咱揍,這樣既不好讀也不好維護(hù)颖榜,尤其針對一些 shell 命令,我們在前端工程中應(yīng)該見過不少這樣的煤裙。

我舉個列子:

"scripts": {
  "dev": "webpack-dev-server --base test/ --port 8081 --config build/webpack.dev.config.js",
  "lint:fix:utils": "eslint --fix \"./packages/utils/**\" --ext .js,.ts,.json"
}
  • json寫法:

    不支持

  • yaml寫法:

    # 注意縮進(jìn)掩完,第二行、第三行開頭有空格(必須這樣寫)
    dev: webpack-dev-server --content-base test/ 
      --port 8081 
      --config build/webpack.dev.config.js
    

    字符串可以寫成多行硼砰,從第二行開始且蓬,必須有一個單空格縮進(jìn)。換行符會被轉(zhuǎn)為空格题翰。

  • toml寫法:

    dev = """
    webpack-dev-server --base test/ 
    --port 8081 
    --config build/webpack.dev.config.js
    """
    

    多行基本字符串由三個引號包裹恶阴,允許折行诈胜。

    官方規(guī)范:緊隨開頭引號的那個換行會被去除,其它空白和換行會被原樣保留冯事。

    特別注意:@ltd/j-toml解析庫目前支持自定義拼接焦匈,比如你想要以 ' '空格進(jìn)行拼接,而不使用換行'\n'拼接(TOML.parse(data, { joiner: ' ' }))昵仅,以本例舉例缓熟,我換行是為了易讀,在解析之后的命令應(yīng)該還是一行的摔笤、一個整體的够滑,就可以使用這種方式

    你還可以用行末反斜杠自動剔除非空白字符前的任何空白字符:

    dev = """
    webpack-dev-server --base test/ \
          --port 8081 \
          --config build/webpack.dev.config.js \
    """
    

    解析結(jié)果如下:

    {
      dev: 'webpack-dev-server --base test/ --port 8081 --config build/webpack.dev.config.js'
    }
    

3?? 字面量字符串

為了方便理解,你把它當(dāng)成JS的模板字符串即可吕世,沒有轉(zhuǎn)義行為版述,所見即所得。

這里以保留換行為例說明:

  • json寫法:

    不支持寞冯,JSON只能用引號""渴析,但是如果你想保留類似換行操作符一樣的東西,你可以這樣做

    { 
      "hi": "echo hello \n world \n 我是小明",
      "ha": "echo \"hello\" \"world\""
    }
    

    很煩吮龄,看著就難受的一批俭茧,寫法也很操蛋~,我只能說“打擾了”??

    換行需要添加 \n漓帚,以及你要是想在JSON中輸出引號""母债,就必須進(jìn)行轉(zhuǎn)義

  • yaml寫法:

    在首行加一個 | 符號即可,還是蠻簡單的尝抖,縮進(jìn)一定要把握好~

    hi: |
      echo hello
      world
      我是小明
    

    解析為JS如下:

    { hi: 'echo hello\nworld\n我是小明\n' }

    • 如果你想保留文字塊末尾的換行毡们,可以使用 |+
    • 如果你想刪除字符串末尾的換行,可以使用 |-
    hi: |-
      echo hello
      world
      我是小明
    

    解析為JS如下:

    { hi: 'echo hello\nworld\n我是小明' }

  • toml寫法:

    字面量字符串由單引號包裹昧辽,不能換行(不會進(jìn)行任何轉(zhuǎn)義)

    path = 'C:\Users\nodejs\templates'
    path2 = '\\User\admin$\system32'
    quoted = 'Tom "Dubs" Preston-Werner'
    regex = '<\i\c*\s*>'    
    

    多行字面量字符串兩側(cè)各有三個單引號來包裹衙熔,允許換行。

    # 三個單引號包裹
    hi = '''
    echo 
    hello 
    world 我是小明
    '''
    

    解析為JS如下:

    { hi: 'echo \nhello \nworld 我是小明\n' }

    解析規(guī)則TOML.parse(data, { joiner: '\n' })

字符串用法小結(jié)

總的來說搅荞,JSON對于字符串的支持還是比較弱的红氯,對于多行字符串等寫法使用比較吃力;yaml總體來說簡單方便咕痛,對字符串的支持還是不錯的痢甘,相關(guān)解析庫也很易用,唯一需要注意的就是縮進(jìn)需要把控好茉贡;如果要說對字符串的支持能力塞栅,toml是最強(qiáng)的毋庸置疑,也沒有縮進(jìn)語法的擔(dān)憂腔丧,幾乎支持你所能相到的任何場景放椰,不過王暗,目前確實(shí)存在使用量不高,第三方解析庫不太穩(wěn)定的問題庄敛。

npm周下載量(Weekly Downloads)大致如下:

  • js-yaml53,724,459
  • @ltd/j-toml33,951 (1.0版本后官方指定的解析庫)
  • toml666,591(0.4版本,不活躍)

千萬級別和萬級別的對比~

@ltd/j-toml解析庫對于存在多行字符串的toml文件進(jìn)行解析時科汗,必須要手動指定拼接規(guī)則({ joiner: '' })藻烤,有點(diǎn)奇怪,不過头滔,這樣也使得我們在處理多行字符串時怖亭,可以自定義拼接規(guī)則,以此實(shí)現(xiàn)不同的效果(要是說對于一個文件內(nèi)多個多行字符串選擇不同的處理方式坤检,有待商榷)

對象

對象寫法還是非常普遍的兴猩,對于該核心語法的掌握還是很有必要的,其實(shí)也是鍵值對的范疇早歇,舉例如下:

1?? 簡單用法

  • json寫法:

    {
      "desc": {
        "color": "red",
        "eaten": false,
        "age": 1
      }
    }
    

    對于JSON來說倾芝,還是老樣子,不支持注釋箭跳,必須用引號包括晨另,如果值為字符串也要使用引號進(jìn)行包裹,非字符串類型可以不用引號包裹

  • yaml寫法:

    # 描述
    desc:
      color: red # 顏色
      eaten: false
      age: 1
    

    解析為JS如下:

    { 
      desc: { 
        color: 'red', 
        eaten: false, 
        age: 1 
      } 
    }
    

    可以發(fā)現(xiàn)谱姓,yaml是可以很好地識別非字符串類型的借尿,數(shù)值類型和布爾值都正確轉(zhuǎn)義

  • toml寫法:

    # 描述
    [desc]
    color: red # 顏色
    eaten: false
    age: 1
    

    對象在toml中稱為(也被稱為哈希表或字典),是鍵值對的集合屉来,它們由表頭定義路翻,連同方括號作為單獨(dú)的行出現(xiàn)([desc])。

    對于toml來說茄靠,鍵名可以是裸露的茂契,引號引起來的,或點(diǎn)分隔的(十分強(qiáng)大的能力)慨绳。

    解析為JS如下:

    解析規(guī)則:TOML.parse(data, { bigint: Number.MAX_SAFE_INTEGER })

    只要在超過 Number.MAX_SAFE_INTEGER 這個范圍后账嚎,才會啟用 BigInt,一般整型寫法用這個就行了

    { 
      desc: { 
        color: 'red', 
        eaten: false, 
        age: 1 
      } 
    }
    

    可以發(fā)現(xiàn)儡蔓,yaml是可以很好地識別非字符串類型的郭蕉,數(shù)值類型和布爾值都正確轉(zhuǎn)義

2?? 復(fù)雜一些的用法

在使用對象時也會遇到多個對象結(jié)構(gòu)與嵌套的情況,如下:

  • json寫法:

    {
      "desc": {
        "color": "red",
        "eaten": false,
        "age": 1
      },
      "animals": {
        "dog": {
          "color": "black"
        },
        "cat": {
          "color": "red"
        }
      }
    }
    
  • yaml寫法:

    desc:
      color: red
      eaten: false
      age: 1
    animals:
      dog:
        color: black
      cat:
        color: red
    

    yaml寫法還是滿簡單清晰地喂江,控制好縮進(jìn)一切OK

  • toml寫法:

    [desc]
    color = "red" # 顏色
    eaten = false
    age = 1
    
    [animals]
    dog.color = "black"
    cat.color = "red"
    

    官方推薦使用標(biāo)準(zhǔn)的表寫法([desc]作為表頭)召锈,每個表可以理解為一個對象體。不過获询,因?yàn)?toml強(qiáng)大的語法系統(tǒng)涨岁,你甚至可以直接使用點(diǎn).寫法拐袜,不過為了規(guī)范和易讀推薦使用官方寫法。

    你可以這樣寫:

    desc.color = "red" # 顏色
    animals.dog.color = "black"
    

    你還可以這樣寫:

    desc.color = "red" # 顏色
    
    [animals.dog]
    color = "black"    
    

    你甚至可以這樣寫:

    # toml對于鍵的解析能力十分強(qiáng)大梢薪,其他特殊寫法都會被標(biāo)準(zhǔn)化處理
    desc."color" = "red" # 顏色
    animals .    "dog" .color = "black"
    

    解析為JS如下:

    {
      desc: { color: 'red' },
      animals: { 
        dog: { 
          color: 'black' 
        } 
      },
    }
    

對象用法小結(jié)

總的來說蹬铺,JSON對于對象的寫法支持還是蠻OK的,但是需要指出的是秉撇,JSON不支持注釋甜攀,這是硬傷,而且和另外兩個格式相比較而言琐馆,寫法也是略顯繁瑣规阀;yaml總體來說挺不錯的,寫法簡潔瘦麸、清爽谁撼,我還是蠻喜歡的,需要指出的是對于縮進(jìn)的處理一定要注意滋饲,yaml語法規(guī)范嚴(yán)格厉碟,一個縮進(jìn)不對就會解析錯誤;就目前而言屠缭,toml在對象語法和使用上優(yōu)勢明顯墨榄,寫法也是十分簡單,而且其對鍵名的寫法支持異常強(qiáng)大勿她,極大的豐富了不同場景下的需求袄秩,不過,需要指出的是逢并,從易讀和已維護(hù)性考慮之剧,還是推薦按照官方規(guī)范的寫法使用。

數(shù)組與嵌套組合

數(shù)組以及JSON數(shù)組等常見用法的對比舉例砍聊,如下:

1?? 數(shù)組的基本用法

  • json寫法:

    {
      "desc": [ "red", false, { "color": "red", "age": 1 } ] 
    }
    
  • yaml寫法:

    desc:
      - red
      - false
      - color: red # 數(shù)組內(nèi)的對象寫法需要注意
        age: 1 # 同一對象下的項(開頭沒有 - )
    

    數(shù)組的項通過 - 表示

  • toml寫法:

    desc = ["red", false, { color = "red", age = 1 }]
    
    desc = [
      "red", 
      false, 
      { 
        color = "red", 
        age = 1 
      }
    ]
    

    空白會被忽略背稼,子元素由逗號分隔,合規(guī)的類型都可以作為值玻蝌,可以混合不同類型的值

2?? JSON數(shù)組多級嵌套的的基本用法

  • json寫法:

    {
      "animals": [
        {
          "desc": [
            "red",
            false,
            1
          ]
        },
        {
          "dog": [
            {
              "color": "black",
              "age": 1
            },
            {
              "color": "white",
              "age": 2
            }
          ],
          "cat": [
            {
              "color": "black",
              "age": 3
            }
          ]
        }
      ]
    }
    
  • json寫法:

    animals:
      - desc:
        - red
        - false
        - 1
      - dog:
        - color: black
          age: 1
        - color: white
          age: 2
        cat:
        - color: black
          age: 3
    
  • toml寫法:

    [[animals]]
    desc = ["red",false,1]
    
    [[animals.dog]]
    color = "black"
    age = 1
    
    [[animals.dog]]
    color = "white"
    age = 2
    
    [[animals.cat]]
    color = "black"
    age = 3
    

    數(shù)組在toml中稱為表數(shù)組蟹肘,它通過把表名寫在雙方括號里的表頭來表示([[animals]]

    表頭的第一例定義了這個數(shù)組及其首個表元素,而后續(xù)的每個則在該數(shù)組中創(chuàng)建并定義一個新的表元素俯树。這些表按出現(xiàn)順序插入該數(shù)組

    注意和對象的區(qū)別帘腹,表是一個括號表示 [desc],表數(shù)組是雙方括表示 [[animals]]

數(shù)組與嵌套數(shù)組小結(jié)

其實(shí)作為配置文件來說许饿,數(shù)組一般還是有不少使用場景的阳欲,對于掌握數(shù)組的基本用法還是蠻有必要的,但是,對于類JSON數(shù)組來說球化,使用場景比較有限(gtHub action配置文件中這種用法多一些)秽晚。

竟然覺得JOSN看著屬于比較清晰、易讀的筒愚;yaml寫法我在配置github action的時候使用過赴蝇,當(dāng)時就是語法縮進(jìn)和數(shù)組對象結(jié)構(gòu)一起使用時犯了錯,耽誤了不少時間定位問題巢掺,還是那句話句伶,yaml對于縮進(jìn)的處理需要特別注意;toml我用著還是不太習(xí)慣址遇,但是總體結(jié)構(gòu)劃分、讀寫性上絕對值得點(diǎn)贊斋竞,看著還是比較清晰地倔约,就是對于表的使用需要適應(yīng),用習(xí)慣了覺得是值得推薦的坝初。

總結(jié)

好了浸剩,就寫這么多吧。對于相關(guān)內(nèi)容感興趣的可以去官方文檔進(jìn)一步查看鳄袍,本文也只是通用功能的概括绢要,篇幅有限,很多高級用法這里不再贅述拗小。

其實(shí)重罪,這整個一輪學(xué)習(xí)、分析對比下來哀九,就這三種配置文件格式來說剿配,如果沒有特殊使用場景,到了一定需要考慮選擇配置文件的地方阅束,我覺得吧呼胚,就JS對象用著就挺好的,畢竟人家webpack這么多配置息裸,用著不也是完全ok蝇更;但是這樣說是屬于比較局限于前端角度的看法,畢竟我們對于JS語言整體是熟悉的呼盆,上手起來自然容易些年扩。

但是,作為配置文件來說访圃,它一定不能像開發(fā)語言一樣那么的重常遂,其實(shí)也不需要那么多功能,我們對配置文件的定位就是,它只要能覆蓋我們基本的使用場景也就足夠了克胳。

資料

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末斑响,一起剝皮案震驚了整個濱河市挚冤,隨后出現(xiàn)的幾起案子挠锥,更是在濱河造成了極大的恐慌准谚,老刑警劉巖勋又,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瓢谢,死亡現(xiàn)場離奇詭異襟衰,居然都是意外死亡满败,警方通過查閱死者的電腦和手機(jī)肤频,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來算墨,“玉大人宵荒,你說我怎么就攤上這事【秽郑” “怎么了报咳?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長挖藏。 經(jīng)常有香客問我暑刃,道長,這世上最難降的妖魔是什么膜眠? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任岩臣,我火速辦了婚禮,結(jié)果婚禮上宵膨,老公的妹妹穿的比我還像新娘婿脸。我一直安慰自己,他們只是感情好柄驻,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布狐树。 她就那樣靜靜地躺著,像睡著了一般鸿脓。 火紅的嫁衣襯著肌膚如雪抑钟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天野哭,我揣著相機(jī)與錄音在塔,去河邊找鬼。 笑死拨黔,一個胖子當(dāng)著我的面吹牛蛔溃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼贺待,長吁一口氣:“原來是場噩夢啊……” “哼徽曲!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起麸塞,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤秃臣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后哪工,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奥此,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年雁比,在試婚紗的時候發(fā)現(xiàn)自己被綠了稚虎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡偎捎,死狀恐怖蠢终,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鸭限,我是刑警寧澤蜕径,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布两踏,位于F島的核電站败京,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏梦染。R本人自食惡果不足惜赡麦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望帕识。 院中可真熱鬧泛粹,春花似錦、人聲如沸肮疗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伪货。三九已至们衙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間碱呼,已是汗流浹背蒙挑。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留愚臀,地道東北人忆蚀。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親馋袜。 傳聞我的和親對象是個殘疾皇子男旗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容