在开发中,我们经常使用各种配置文件,通常会使用ini,json,xml,yaml,toml,properties, env等。
ini
- 一种简单的配置文件格式,使用section和键值对来存储数据。
json
(JavaScript Object Notation) - 轻量级数据交换格式,易于人阅读和编写。
xml
(eXtensible Markup Language) - 一种标记语言,用于存储和传输数据,具有严格的结构和子描述性。
yaml
(YAML Ain't Markup Language) - 一种人类可读的数据序列化格式。
toml
(Tom's Obvious, Minimal Language) - 一种轻量级的数据配置文件格式。
properties
- 一种简单的键值对配置格式,常用于java。
env
- 一种简单的环境变量配置格式。我们在 nodejs里的dotenv - 管理好应用的配置 这篇文章里面有过介绍,感兴趣可以看看。
TOML介绍
今天介绍的是toml这个算是比较新兴的配置格式。
TOML = Tom's Obvious, Minimal Language
作者是 Tom Preston-Werner 等
toml的目标是成为一个语义明显且易于阅读的最小化配置文件格式。
由于其精确的语义,使得这种格式易于阅读。它被设计成可以无歧义地映射到散列表,因此应该能很容易地被解析成各种语言中的数据结构。
TOML 语法简介
TOML 是大小写敏感的。
TOML 文件必须是合法的UTF-8编码的Unicode文档。
空白是指制表符(0x09
)或空格(0x20
)。
换行是指LF(0x0A)
或CRLF(0x0D 0x0A)
。
使用 #
字符将该行余下的部分标记为注释,除非它在字符串中。
# 这是注释
secret="AFAFE" # 这是注释
password="EF#这不是注释"
键值对是TOML文档最基本的构成区块。键名中等号的左边而值在右边。键名和键值周围的空白会被忽略,键、等号和值必须在同一行。不指定值是非法的。
key = "value"
invalid = # 这是非法的
= "no key name" # 没有键名,这是非法的
键名使用点分隔键可以将相近的属性放在一起:
name = "Apple"
props.color = "Red"
props.size = "Big"
price = 20.50
等价于JSON:
{"name": "Apple","props": {"color": "Red","size": "Big"},"price": 20.50
}
值必须是下述类型之一:
1.字符串
str = "这是字符串, \"引号需要转义\"" # 由引号"包裹# 由三个引号包裹,允许折行
str = """
这是字符串,
这是字符串2."""# 等价于
str = "这是字符串,\n这是字符串2."
单引号包裹或者三个单引号包裹的字符串没有转义。
2.整数、浮点数和布尔值
key1 = 12
key2 = -18
key3 = 0
key4 = 05 # 非法
hex1 = 0xDEAD # 0x 前缀的16进制
oct1 = 0o234 # 0o 前缀的8进制
bin1 = 0b11001 # 0b 前缀的2进制key1 = 1.0
key2 = -0.01
key3 = .7 # 非法
key4 = 7. # 非法
key5 = inf # 无穷key1 = true
key2 = false
3.日期时刻
可以使用指定了时区偏移量的 RFC 3339 格式的日期时刻.
date1 = 2024-12-19T17:32:00Z
date2 = 2024-12-19 17:32:00Z # 使用空格替换T
date3 = 2024-12-19T17:32:00 # 省略时区偏移量
date4 = 2024-12-19 # 日期
date5 = 08:30:00 # 时间
4.数组
数组是内含值的方括号,子元素有逗号分隔。可以混合不同的类型值。
arr1 = [1, 2, 3]
colors = ["红", "绿", "黄"]
arr2 = ["Example",{ name = "Tom", phone = "88888888" }
]
5.表(哈希表或字典)
表说键值对的集合,由表头定义,连同方括号作为单独的行出现。在它下方直到下一个表头或文件结束,都是这个表的键值对。
[table1]
key1 = "value1"
key2 = 1234
等价于下面的JSON:
{ "table1": { "key1"; "value1", "key2": 1234 } }
应用例子
下面介绍一下在nodejs下怎样使用toml文件格式作为配置文件。
首先安装toml依赖,用于解析toml文件:
yarn add toml
然后添加一个toml配置文件 server.toml
:
[server]
host = ""
port = 3000
basePath = ''
behindProxy = false
接着就可以这个js里面解析该配置了:
import fs from 'node:fs';
import toml from 'toml';class ConfigParser {constructor() {this.config = {};}getConfig() {return this.config;}parseFile() {try {const tomlFile = fs.readFileSync('server.toml', 'utf8');Object.assign(this.config, toml.parse(tomlFile));} catch (error) {throw new Error('Parsing file failed ' + error);}}
}const configParser = new ConfigParser();
configParser.parseFile();
const config = configParser.getConfig();
console.log(config);
运行这个js,可以看到打印出来的正是server.toml
的内容,以object的形式呈现:
$ node demo.js {server: [Object: null prototype] {host: '',port: 3000,basePath: '',behindProxy: false}
}
最佳实践
使用toml
(或者yaml,json)来做应用的默认配置以及配置定义,即应用启动的最小配置集。
使用.env
来给不同环境/不同人员做个性化配置。使用环境变量 processs.env
来做运行时覆盖。
References
https://toml.io/cn/
https://github.com/toml-lang/toml
原创 蓝天白云喵 喵舍宝典