2026年常见的配置文件格式——为什么程序员永远在折腾缩进和括号?—— 常见配置文件进化史(md文档很详细)

目录

内容简介:

一、数据标记(最基础、最通用)

[1. JSON (.json)](#1. JSON (.json))

[(1)认识 JSON](#(1)认识 JSON)

(2)跨语言序列化

[(3)JSON 语法速成](#(3)JSON 语法速成)

[2. YAML (.yaml / .yml)](#2. YAML (.yaml / .yml))

[(1)认识 YAML](#(1)认识 YAML)

(2)为运维与自动化而生

[(3)YAML 语法与避坑速成](#(3)YAML 语法与避坑速成)

[3. XML (.xml)](#3. XML (.xml))

[(1)认识 XML](#(1)认识 XML)

(2)极致的校验与规范

[(3)XML 语法与避坑速成](#(3)XML 语法与避坑速成)

[4. INI (.ini)](#4. INI (.ini))

[(1)认识 INI](#(1)认识 INI)

(2)面向"非程序员"的友好度

[(3)INI 语法与痛点速成](#(3)INI 语法与痛点速成)

[5. TOML (.toml)](#5. TOML (.toml))

[(1)认识 TOML](#(1)认识 TOML)

(2)兼顾"人类可读"与"机器严谨"

[(3)TOML 语法与亮点速成](#(3)TOML 语法与亮点速成)

二、特定生态/环境派(开发必备)

[6. ENV (.env)](#6. ENV (.env))

[(1)认识 ENV](#(1)认识 ENV)

(2)防泄漏与环境切换

[(3)ENV 语法与避坑速成](#(3)ENV 语法与避坑速成)

[7. Properties (.properties)](#7. Properties (.properties))

[(1)认识 Properties](#(1)认识 Properties)

(2)用"点"打天下的扁平化嵌套

[(3)Properties 语法与天坑速成](#(3)Properties 语法与天坑速成)

[8. HCL (.hcl)](#8. HCL (.hcl))

[(1)认识 HCL](#(1)认识 HCL)

(2)基础设施即代码 (IaC)

[(3)HCL 语法与避坑速成](#(3)HCL 语法与避坑速成)

三、服务与系统(侧重架构)

[9. Conf (.conf)](#9. Conf (.conf))

[(1)认识 Conf](#(1)认识 Conf)

(2)掌控流量与系统命脉

[(3)Conf 语法与避坑速成](#(3)Conf 语法与避坑速成)

[10. Protobuf (.proto)](#10. Protobuf (.proto))

[(1)认识 Protobuf](#(1)认识 Protobuf)

(2)跨语言的"接口说明书"

[(3)Protobuf 语法与天坑速成](#(3)Protobuf 语法与天坑速成)

[11. REG (.reg)](#11. REG (.reg))

[(1)认识 REG](#(1)认识 REG)

(2)给操作系统"打点滴"

[(3)REG 语法与高阶玩法(极客必会)](#(3)REG 语法与高阶玩法(极客必会))

四、文本与脚本(动态配置)

[12. Markdown (.md)](#12. Markdown (.md))

[(1)认识 Markdown](#(1)认识 Markdown)

[(2)Front Matter](#(2)Front Matter)

[(3)Markdown 语法速成](#(3)Markdown 语法速成)

[13. JavaScript (.js / .mjs)](#13. JavaScript (.js / .mjs))

[(1)认识 JS 脚本配置](#(1)认识 JS 脚本配置)

(2)逻辑即配置

[(3)JS 配置语法](#(3)JS 配置语法)

14.TypeScript (.ts)

[(1)认识 TS 脚本配置](#(1)认识 TS 脚本配置)

(2)告别"盲人摸象"

[(3)TS 配置语法与天坑速成](#(3)TS 配置语法与天坑速成)

(4)Vue和React应用的区别

[15. Python (.py)](#15. Python (.py))

[(1)认识 Python 脚本配置](#(1)认识 Python 脚本配置)

(2)动态探测与环境感知

[(3)Python 配置语法与高阶玩法(避坑速成)](#(3)Python 配置语法与高阶玩法(避坑速成))


内容简介:

在现代软件开发中,配置文件早已不只是"附属品",而是决定系统行为与架构的核心控制层。

本文系统梳理了从基础数据格式(JSON、YAML、XML、INI、TOML),到开发与运维生态(.env、Properties、HCL),再到系统服务与高性能通信(.conf、Protobuf),以及动态配置方案(JavaScript、TypeScript、Python)在内的主流配置文件体系。

通过结构化分类 + 核心语法 + 实战避坑的方式,帮助你:

  • 理解不同配置格式的设计哲学与适用场景
  • 掌握每种格式的关键语法与常见陷阱
  • 建立从"数据描述 → 系统配置 → 架构控制"的整体认知

无论你是后端开发、AI工程师、运维人员,还是正在构建复杂系统的开发者,这篇内容都将成为你理解"配置驱动世界"的一份高效参考指南。

一、数据标记(最基础、最通用)

这类格式主要用于结构化地存储数据。

1. JSON (.json)

(1)认识 JSON

  • 标签: 互联网通行证,数据交换的绝对王者。

  • 特点:

    • 极简纯粹: 全称是 JavaScript Object Notation。独立于 JS,机器解析速度极快,所有主流编程语言都原生支持它。

    • 键值对结构: 数据组织形式极其清晰,左边是键(Key),右边是值(Value),一目了然。

    • 绝对不支持注释: 这是它作为配置文件最大的痛点,为了保持数据的纯粹性,发明者硬生生砍掉了注释功能。

  • **作用:**前后端 API 接口传输数据、各种软件和工程的配置文件(如 Node.js 的 package.json,VS Code 的 settings.json)、AI 模型与硬件通信的参数配置。

(2)跨语言序列化

你可能会问:既然它不支持注释,为什么大家还这么爱用它写配置?

这是因为 JSON 是一种"跨语言的通用货币"。假设你用 Python 写了一个控制中枢,而底层硬件控制是用 C++ 写的。它们之间无法直接交流,但只要把配置写成 JSON,不管是 Python 还是 C++ 都能瞬间读懂并完美解析。

常见写法演示:

{

"_comment": "这是一个机器人配置对象示例",

"robot_model": "mi2026",

"version": "2.0.1",

"enable_lidar_stealth": true,

"status": "waiting",

"pid_parameters": {

"_comment": "PID 参数(比例、积分、微分)",

"p": 1.5,

"i": 0.2,

"d": 0.05

},

"supported_cameras": ["csi", "usb"]

}

效果预览: 这段配置清晰地定义了一台机器人的型号、当前的等待状态、嵌套的 PID 控制参数,以及一个包含不同摄像头接口的数组列表。

JSON 对象中添加了 _comment 键,分别说明了各部分的功能。这样既遵守了 JSON 规范,又能清楚地看到注释说明。

(3)JSON 语法速成

JSON 的设计理念就是"不容许任何歧义"。它的语法虽然简单,但极其严格。以下是你写 JSON 最常用的 6 个核心规则:

用法一:对象(用 {} 搞定层级)

在 JSON 中,花括号 {} 代表一个对象(Object)。对象里面就是一组一组的"键值对"。

{

"_comment": "用法一:对象(用 {} 搞定层级)",

"project_name": "AI_Tour_Guide",

"team_size": 4

}

用法二:数组(用 [] 整理列表)

中括号 [] 代表数组(Array),用来存放一组有序的数据。数组里可以放字符串、数字,甚至可以放其他对象。

{

"_comment": "用法二:数组(用 [] 整理列表)",

"frameworks": [

"PyTorch",

"OpenCV",

"Ollama"

]

}

用法三:严格的双引号(绝不妥协的 Key)

在 Python 或 JS 里,单引号和双引号经常混用。但在 JSON 里,所有的键名(Key)和字符串类型的值,必须、绝对只能用双引号 "" 包裹!(千万不要写成单引号,解析器会直接报错)。

{

"_comment": "用法三:严格的双引号(绝不妥协的 Key)",

"model": "Qwen"

}

用法四:数据类型(只认这 6 种)

JSON 的值只支持 6 种基本数据类型:字符串、数字、布尔值(true/false,注意必须全小写)、数组、对象、null(空值)。不支持函数或日期对象。

{

"_comment": "用法四:数据类型(只认这 6 种)",

"is_ready": true,

"accuracy_score": 98.5,

"error_message": null

}

用法五:嵌套结构(无限套娃)

配置复杂系统时,可以将对象和数组互相嵌套,理论上可以无限嵌套下去,用来表达极其复杂的数据结构。

{

"_comment": "用法五:嵌套结构(无限套娃)",

"server": {

"ip": "127.0.0.1",

"ports": [

8080,

3306

],

"hardware": {

"gpu": "RTX 4070",

"cuda_enabled": true

}

}

}

用法六:致命的尾逗号(千万别加!)

这是所有写 JSON 的程序员踩过最多的坑。在对象或数组的最后一个元素后面,绝对不能加逗号!

{

"_comment": "用法六:致命的尾逗号(千万别加!)",

"target": "object_detection",

"confidence": 0.85

}

2. YAML (.yaml / .yml)

(1)认识 YAML

  • 标签: 云原生标配,最懂人类的配置语言。标准用法是 .yaml.yml
  • 特点:
    • 极简视觉: 它的全称很有意思:"YAML Ain't Markup Language"(YAML 不是标记语言)。它彻底抛弃了 XML 的标签和 JSON 的括号,完全靠缩进来表示层级关系。
    • 原生支持注释: 终于可以愉快地用 # 写注释了!
    • 强大的高级特性: 支持多行字符串、支持数据类型的强转,甚至支持"变量引用"(锚点),可以极大减少配置文件的重复代码。
  • 作用:Docker 的编排文件(docker-compose.yml)、Kubernetes 的部署清单、自动化流水线(GitHub Actions、GitLab CI)、Java Spring Boot 的核心配置文件(application.yml)。

(2)为运维与自动化而生

如果说 JSON 是给机器快速读取的,那 YAML 就是优先写给人类看的。在动辄几百行的服务器部署清单中,如果没有注释,满屏的 {} 绝对会让运维人员崩溃。YAML 像写诗一样的排版,让复杂的架构层级一目了然。

常见写法演示:

这是一个标准的 Docker Web 服务配置

version: '3.8'

services:

web:

image: nginx:latest

ports:

  • "80:80"

environment:

  • NGINX_PORT=80

  • DEBUG=true

效果预览: 只看一眼就能明白,这是一个包含版本号的配置,定义了一个名为 web 的服务,使用了 Nginx 镜像,并配置了端口映射和环境变量。没有任何多余的标点符号。

(3)YAML 语法与避坑速成

YAML 的语法看起来极其优雅,但如果你不了解它的"潜规则",分分钟会被报错逼疯。以下是你必须要掌握的 7 个核心用法与天坑:

用法一:键值对(必须要有空格!)

这是新手死得最多的地方!键值对用冒号 : 连接,但冒号后面必须至少跟着一个空格,绝不能紧挨着写。

用法一:键值对(必须要有空格!)

正确写法:冒号后有空格

app_name: my_blog

错误写法(会报错,机器会以为这是一个完整的字符串):

app_name:my_blog

用法二:层级缩进(绝对禁止使用 Tab 键)

YAML 靠左侧的空白缩进来表示数据的从属关系(类似 Python)。铁律:只能用空格缩进,绝对不能按 Tab 键!(通常约定俗成使用 2 个空格表示一层嵌套)。

用法二:层级缩进(绝对禁止使用 Tab 键)

server:

host: 127.0.0.1

port: 8080

database:

user: root

password: password123

用法三:数组与列表(用减号 -

当你想表达一个列表时,在同一缩进级别下,使用短横线 - 加上一个空格打头。

用法三:数组与列表(用减号 -

表示一个人掌握的多种技能

skills:

  • Python

  • JavaScript

  • Docker

用法四:对象数组(灵活组合)

把列表和嵌套结合起来,就能表达复杂的对象集合(这在 Kubernetes 配置中极其常见)。

用法四:对象数组(灵活组合)

users:

  • name: Alice

role: admin

age: 28

  • name: Bob

role: editor

age: 24

用法五:多行文本的救星(|>

如果在 JSON 里写一段包含换行符的极长文本(比如一段脚本),你要写无数个 \n。而在 YAML 里,有两个魔法符号:

  • | (保留换行符): 你怎么排版,它就怎么读取。

  • > (折叠换行符): 会把你写的多行文本合并成一行(用空格代替换行)。

用法五:多行文本的救星(|>

使用 | 保留换行。通常用来把一段 Bash 脚本直接嵌在配置文件里!

script: |

#!/bin/bash

echo "Hello World"

npm run build

使用 > 适合写长篇的描述文本

description: >

这是一段非常长的描述,

虽然我在这里换行了,

但最终程序读取时,它会变成一整句话。

用法六:锚点与引用(配置文件里的"变量")

这是 YAML 的高级杀手锏!如果你有一段配置在多处重复出现,你可以用 & 给它起个名字(锚点),然后用 * 在其他地方引用它。

用法六:锚点与引用(配置文件里的"变量")

用 &base_db 记住这块配置

base_database: &base_db

host: localhost

port: 3306

development_db:

<<: *base_db # 把上面的配置合并过来

database: dev_db

production_db:

<<: *base_db # 再次合并

database: prod_db

用法七:隐式类型转换(致命陷阱⚠️)

YAML 太聪明了,聪明到有时候会自作主张。它会根据你的输入自动推断数据类型。

  • 如果你写 port: 22,它是数字。

  • 如果你写 version: 1.0,它是浮点数。

  • 天坑来了: 在早期的 YAML 标准中,像 y, Y, yes, on, no, off 都会被自动转换成布尔值 truefalse!如果你有一个国家的缩写正好是 NO(挪威),程序读取时会变成 false

避坑指南: 如果你想要它纯粹是个字符串,老老实实加上双引号!

用法七:隐式类型转换(致命陷阱⚠️)

country: "NO" # 字符串 "NO"

version: "3.0" # 字符串 "3.0",防止被解析成浮点数 3.0

YAML 的优缺点其实非常两极分化:看着很爽,但"缩进多一个空格少一个空格"往往肉眼看不出来,导致排错极其痛苦。

这就是为什么业界后来又推出了 TOML ------ 一个试图结合 INI 的简单和 YAML 的强大的终极新星。

3. XML (.xml)

(1)认识 XML

  • 标签: 严谨的长辈,企业级系统的基石。

  • 特点:

    • 全称: Extensible Markup Language(可扩展标记语言)。

    • 标签闭合: 长得像 HTML,所有的数据都被包裹在标签里(如 <name>张三</name>),并且有开必有闭

    • 极度严谨(支持校验): 这是它最强大的地方。通过结合 DTD 或 XSD(Schema),你可以严格规定这个文件里只能出现哪些标签、标签必须按什么顺序排、里面只能填什么类型的数据。

    • 原生支持注释: 使用 <!-- 这是一段注释 -->

  • 作用: Java 生态的核心配置(如 Maven 的 pom.xml,Spring 早期的 Bean 配置)、Android 的 UI 布局文件、SVG 矢量图形的底层代码、各种老牌企业级软件(如 Tomcat)的配置。

(2)极致的校验与规范

你可能会问:既然大家都嫌它啰嗦,写个配置满屏都是尖括号,为什么银行、大型互联网公司的老系统还死抱着它不放?

答案是:安全感与强大的 IDE 支持。

当你用 JSON 或 YAML 写配置时,如果你把 port 拼成了 prot,程序只有在运行的时候 才会崩溃报错。而 XML 因为有 Schema 校验,只要你引入了官方的规范字典,你在写代码的时候,如果敲错了标签名,编辑器(IDE)立刻就会给你画红线报错,并且还能提供极其精准的代码提示! 这种"防呆设计"对于动辄几万行配置的大型工程来说,简直是救命的。

常见写法演示:

<?xml version="1.0" encoding="UTF-8"?>

<configuration>

<!-- 这是一个数据库连接池的配置 -->

<database>

<driver>com.mysql.cj.jdbc.Driver</driver>

<url>jdbc:mysql://localhost:3306/mydb</url>

<username>root</username>

<password>secure_pass_123</password>

<!-- 最大连接数 -->

<max-connections>50</max-connections>

</database>

</configuration>

效果预览: 结构非常规整。第一行声明了版本和编码,根节点是 <configuration>,里面嵌套了数据库的各项参数。虽然尖括号占了一半的屏幕,但语义绝对不会产生任何歧义。

(3)XML 语法与避坑速成

XML 的语法非常死板,但也正因为死板,它不容易出现 YAML 那种"多一个空格导致全盘崩溃"的灵异事件。以下是写 XML 必须掌握的 5 个核心规则:

用法一:根节点(独裁者规则)

每一个标准的 XML 文件,有且只能有一个根节点(最外层的标签)。所有的配置都必须包在这个根节点里面。

<!-- 用法一:根节点(独裁者规则) <app> -->

<!-- 正确:只有一个外层标签 <app> -->

<app>

<name>My App</name>

</app>

<!-- 错误:有两个平级的根节点(会直接报错) -->

<name>My App</name>

<version>1.0</version>

用法二:标签的开与闭(强迫症患者福音)

任何一个标签都必须闭合!大小写也必须严格匹配。

<!-- 用法二:标签的开与闭(强迫症患者福音) -->

<!-- 标准写法 -->

<port>8080</port>

<!-- 错误写法(没闭合,或者大小写不一致) -->

<port>8080</Port>

<!-- 如果标签里没有内容,可以写成自闭合的简写形式 -->

<enable-ssl />

用法三:属性 vs 子节点(最让人纠结的选择题)

这是写 XML 时最容易引发"门派斗争"的地方。当你想给一个服务器配置端口时,你有两种写法,且在 XML 中都是合法的:

<!-- 用法三:属性 vs 子节点(最让人纠结的选择题) -->

<!-- 写法A:把数据放在标签的【属性】里 -->

<server host="127.0.0.1" port="8080" />

<!-- 写法B:把数据放在【子节点】里 -->

<server>

<host>127.0.0.1</host>

<port>8080</port>

</server>

  • 避坑建议: 行业通用潜规则是------元数据(比如 ID、单位)放在属性里,具体的值放在子节点里 。比如 <timeout unit="ms">5000</timeout>

用法四:特殊字符的转义(天坑⚠️)

既然 XML 靠 <> 来识别标签,如果你要配置的值本身就包含 < 或者 & 怎么办?(比如你在配置一段 SQL 语句 age < 18)。 绝对不能直接写!解析器会以为你开了一个新标签! 必须使用转义字符:

  • < 必须写成 &lt;

  • > 必须写成 &gt;

  • & 必须写成 &amp;

<!-- 用法四:特殊字符的转义(天坑⚠️) -->

<!-- 错误写法 -->
<sql> select * from users where age < 18 </sql>

<!-- 正确写法 -->
<sql> select * from users where age &lt; 18 </sql>

用法五:CDATA 区块(免死金牌)

如果你有一大段代码或者带了很多特殊符号的文本,全部转义太痛苦了。XML 提供了一个"免死金牌" ------ <![CDATA[ ... ]]>。被它包裹的内容,解析器会完全当成纯文本,不再去解析里面的尖括号。

<!-- 用法五:CDATA 区块(免死金牌) -->

<script>

<![CDATA[

// 在这里面你可以随意写 <, >, &,解析器统统不管!

if (a < b && c > d) {

console.log("执行成功");

}

]]>

</script>

XML 最大的问题就是"信噪比太低"。为了传达 8080 这个数据,你不仅要写 <port>,还要再写一遍 </port>,数据的体积硬生生大了一倍。这就是为什么在轻量级的 Web 时代,它被 JSON 迅速击败的原因。但是,XML 那种"泰山崩于前而色不变"的严谨规范,依然值得我们敬畏。

4. INI (.ini)

(1)认识 INI

  • 标签: Windows 经典,极简主义的开山鼻祖。

  • 特点:

    • 全称: Initialization File(初始化文件)。

    • 零学习门槛: 它的语法简单到连完全不懂编程的小白(比如只是想修改游戏画质的普通玩家)都能一眼看懂并修改。

    • 没有嵌套: 不像 JSON 有大括号,也不像 YAML 有缩进,INI 是完全扁平化的。

    • 原生支持注释: 通常使用分号 ; 或井号 # 开头。

  • 作用: Windows 桌面软件配置、老牌游戏的系统设置、轻量级脚本的快速配置。虽然在大型 Web 后端很少见,但在各种小型工具中依然是绝对的主力。

(2)面向"非程序员"的友好度

如果你的软件是面向普通用户的,那 INI 是最好的选择。当你让一个玩家去修改 settings.json 时,他极有可能会因为漏掉一个逗号导致游戏崩溃;但如果你让他改 config.ini,他只需要找到那行字,把数字改掉就行了,几乎不可能出错。

常见写法演示:

; 这是一个典型的游戏或桌面软件配置文件

Graphics

Resolution = 1920x1080

Fullscreen = true

MaxFPS = 60

Audio

MasterVolume = 80

MusicVolume = 50

Mute = false

效果预览: 就像一本书的目录一样,中括号 [ ] 是章节标题,下面跟着一行行的属性配置,没有任何让人眼花的标点符号。

(3)INI 语法与痛点速成

INI 的语法规则一只手就能数得过来,但它在现代开发中暴露出的一些"致命伤",也正是后来其他格式崛起的原因。以下是它的核心用法与痛点:

用法一:节(Section)分类

使用中括号 [ ] 包裹的名字称为"节",用来对配置项进行分组。同一个文件里,节的名字不能重复。

; 用法一:节(Section)分类

Database

Host=127.0.0.1

Port=3306

Server

Host=192.168.1.10

Port=80

通过分组,即使两个板块都有 Host 这个键,也不会起冲突。

用法二:键值对(Key=Value)

非常直白,等号左边是键,右边是值。等号两边的空格一般会被自动忽略(写不写空格都行)。

; 用法二:键值对(Key=Value)

app_name = MyCoolApp

version = 1.0.0

用法三:注释(分号的艺术)

标准的 INI 文件使用分号 ; 作为注释的开头。有些解析器也支持井号 #,但为了兼容性,首选分号。

; 用法三:注释(分号的艺术)

; 开启硬件加速(0=关闭,1=开启)

HardwareAcceleration=1

用法四:天坑痛点(数据类型的迷茫)

这是 INI 最大的硬伤。INI 本身是不区分数据类型的,在它眼里,所有的值都是字符串!

; 用法四:天坑痛点(数据类型的迷茫)

is_admin = true

port = 8080

当你用程序读取这段配置时,你读到的不是布尔值 true,也不是数字 8080,而是字符串 "true""8080"。程序员必须自己在代码里写额外的逻辑,把它们强行转换成布尔值和数字。

用法五:天坑痛点(无法表达列表和多层嵌套)

如果你想在 INI 里表达"这个软件支持三种语言:中文、英文、日文",你会非常痛苦,因为它不支持数组 []。 大家只能发明各种"土办法"(比如用逗号隔开,然后在代码里再去拆分):

; 用法五:天坑痛点(无法表达列表和多层嵌套)

; 这不是 INI 原生支持的列表,只是一个普通的长字符串

SupportedLanguages = zh,en,jp

同时,因为 INI 只有一层 [Section],如果你想表达"服务器配置下的数据库配置下的主机地址"这种三层嵌套结构,INI 直接就懵了。

随着软件越来越复杂,程序员们既想要 INI 这种毫无阅读压力的清晰感,又想要 JSON 那种能明确区分数字、布尔值和数组的能力,还想要 YAML 那种深层嵌套的结构。 于是,配置文件界的集大成者、优雅的最终答案 ------ TOML.

5. TOML (.toml)

(1)认识 TOML

  • 标签: 优雅的新秀,现代编程语言的终极标配。

  • 特点:

    • 全称: Tom's Obvious, Minimal Language(Tom 创造的显而易见、极简的语言)。

    • INI 的究极进化版: 它的外观和 INI 几乎一模一样,但底层却像 JSON 一样拥有极其严谨的数据类型和嵌套能力。

    • 彻底消灭缩进焦虑: 它不关心你有几个空格,彻底根除了 YAML 最让人头疼的缩进报错问题。

    • 原生支持注释: 使用井号 # 作为注释。

  • 作用: Rust 的包管理器(Cargo.toml)、Go 语言项目、现代 Python 工程的标准构建配置(pyproject.toml)、以及越来越多如 ROS 2 这样的现代基础架构系统。

(2)兼顾"人类可读"与"机器严谨"

TOML 最牛的地方在于它找到了一个完美的平衡点。写 TOML 就像在写大纲笔记,视觉上极其扁平清晰;但当机器读取它时,它能完美、无歧义地被转换成一个结构化的字典(Hash Table)。

常见写法演示:

这是一个典型的机器人项目配置

name = "cyberdog_controller"

version = "2.0.0"

dependencies

rclpy = "3.2.1"

numpy = "1.24"

camera

type = "csi"

resolution = [1920, 1080]

enabled = true

TOML 原生支持时间格式!

last_updated = 2026-05-01T12:00:00Z

效果预览: 看起来就像是最简单的 INI 文件,但它明确区分了字符串(带引号)、布尔值(true)、数组([])和极其罕见的原生时间戳。

(3)TOML 语法与亮点速成

TOML 的语法规则就是为了"消除歧义"而生的。以下是你必须要掌握的 5 个核心语法,看完你就知道它为什么能吊打老前辈了:

用法一:极其明确的数据类型

在 INI 中,所有的值都是字符串。而在 TOML 中,数据类型被严格区分,甚至比 JSON 还丰富!

用法一:极其明确的数据类型

str1 = "双引号是基本字符串"

str2 = '单引号是所见即所得的字面量(不转义)'

int_val = 42

float_val = 3.14

bool_val = true

亮点:直接支持原生的日期和时间类型!

dob = 1979-05-27T07:32:00-08:00

用法二:表(Table)------ 优雅的嵌套

TOML 借用了 INI 中 [Section] 的概念,但在 TOML 里它叫作"表"。每一个表都会在解析时变成一个 JSON 对象(字典)。

用法二:表(Table)------ 优雅的嵌套

server

host = "127.0.0.1"

port = 8080

如果想要多层嵌套,直接用英文句号相连!

这种写法彻底干掉了 YAML 那种让人眼花的深层缩进

server.database

user = "admin"

password = "123"

这段代码如果用 JSON 写,需要套两层 {};用 YAML 写,需要严格缩进两次。而在 TOML 里,只需要一行 [server.database] 就能清晰表达。

用法三:内联表(Inline Table)

如果你觉得为了两个键值对单独开一个 [ ] 章节太浪费行数,TOML 允许你像 JSON 一样把它们写在一行里。

用法三:内联表(Inline Table)

使用花括号,这部分和 JSON 极其相似

point = { x = 1, y = 2, z = 3 }

用法四:数组(Array)

完全兼容大家最熟悉的写法,允许跨行,而且允许在最后一个元素后面加逗号(这是对 JSON 最无情的嘲讽)!

用法四:数组(Array)

ports = [

8080,

8081,

8082, # 这里的尾逗号是完全合法的,修改配置时极其方便

]

用法五:表数组(Array of Tables)------ TOML 的独门绝技

这是 TOML 解决"对象列表"最优雅的方式。如果你有一组服务器配置,用连续两个中括号 [[ ]] 就可以搞定。

用法五:表数组(Array of Tables)------ TOML 的独门绝技

这是第一个产品

\[products\]

name = "Jetson Nano"

sku = "JN-001"

这是第二个产品,自动追加到上一个产品所在的数组中

\[products\]

name = "ESP32"

sku = "ES-002"

最后忠告:

  • 如果你要跨语言传输数据 ,或者写 Web API,老老实实用 JSON

  • 如果你要写 Java 企业级框架 的老项目,你逃不掉 XML

  • 如果你在搞 Docker 和 K8s ,你必须忍受 YAML 的缩进折磨。

  • 如果你写的是一个面向非技术人员的单机小工具 ,用最简单的 INI

  • 如果你正在开启一个全新的现代项目 ,并且你有选择权,果断选择 TOML 吧! 它是目前配置文件界最优雅的最终答案。

二、特定生态/环境派(开发必备)

6. ENV (.env)

(1)认识 ENV

  • 标签: 敏感信息的保险箱,环境隔离的变道道岔。

  • 特点:

    • 全称: Environment Variables(环境变量配置文件)。

    • 极致扁平: 没有对象、没有数组、没有层级嵌套,纯粹的 KEY=VALUE

    • 不参与代码逻辑: 它通常不由语言原生的解析器读取,而是被专门的库(比如 Node.js 的 dotenv,Python 的 python-dotenv)读取后,注入到操作系统的环境变量中

    • 最高机密: 这是它最重要的特征------绝对不能被提交到代码仓库(如 GitHub)中!

  • 作用: 存放数据库账号密码、第三方 API 密钥(如微信支付 Secret、OpenAI API Key)、以及区分当前是"开发环境"还是"生产环境"的标识。

(2)防泄漏与环境切换

你可能会问:既然它也是键值对,我为什么不把数据库密码写在 config.jsonapplication.yml 里呢?

想象一个场景:你的项目开源到了 GitHub,或者离职员工拷走了代码。如果你把密码写在 config.json 里,那全天下都知道你的数据库密码了,分分钟被黑客"删库勒索"。

.env 的核心工作流是这样的:

  1. 在代码目录里写一个 .env 文件存真密码。

  2. .gitignore 文件里配置忽略 .env,这样它永远只存在于你的本地电脑或线上服务器里,绝不进入代码版本库
    项目根目录找到 / 新建文件: .gitignore 在里面加一行:

    忽略本地真实环境变量 .env

    作用:Git 自动屏蔽 .env,执行 git add 时永远不会选中它,不会提交、不会上传 GitHub

  3. 再写一个 .env.example(或者 .env.template)提交到代码库,里面只写键名,不写具体密码。新同事拉下代码后,自己复制一份命名为 .env 并填上自己的本地密码。

常见写法演示:

========================================

核心系统配置 (开发环境)

========================================

NODE_ENV=development

PORT=8080

========================================

数据库机密配置 (绝密!!!)

========================================

DB_HOST=127.0.0.1

DB_PORT=3306

DB_USER=root

这里的密码只有本地开发者自己知道

DB_PASSWORD=my_super_secret_local_password

第三方服务密钥

OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxx

效果预览: 没有任何花哨的结构,全部大写字母加下划线,直接了当。

(3)ENV 语法与避坑速成

ENV 的语法可以说是所有配置文件中最简单的,但它依然有几个容易让人抓狂的"隐形大坑":

用法一:标准的键值对(不要乱加空格!)

规范的写法是 KEY=VALUE,全大写字母,单词之间用下划线。天坑警告:等号两边千万不要加空格!

用法一:标准的键值对(不要乱加空格!)

正确写法

API_URL=https://api.example.com

错误写法(解析器会把空格也当成键或值的一部分,导致读取失败)

API_URL = https://api.example.com

用法二:引号的使用时机

大部分情况下你不需要加引号。但如果你的"值"里面包含了空格或者特殊字符,就必须用双引号或单引号包起来。

用法二:引号的使用时机

不需要引号

PROJECT_NAME=MyAwesomeProject

必须加引号(因为值里面有空格)

GREETING_MESSAGE="Hello, Welcome to the system!"

必须加引号(因为密码里可能有 # 会被误认成注释)

DB_PASS="Pass#word!123"

用法三:注释(井号的天下)

使用 # 开头来写注释。如果在行尾写注释,前面最好留个空格。

用法三:注释(井号的天下)

开启调试模式

DEBUG=true

LOG_LEVEL=info # 仅记录普通信息

用法四:变量扩展(高级玩法)

在一些高级的解析库中(如 Docker 或较新的 dotenv 库),你甚至可以在 .env 里让变量互相引用。

用法四:变量扩展(高级玩法)

DOMAIN=example.com

动态引用上面的变量,拼出完整的 URL

API_ENDPOINT=https://api.${DOMAIN}/v1

提醒:

"不小心把带有真实密码的 .env 提交到了 GitHub 怎么办?" 很多新手以为"那我再提交一次,把它删掉不就行了?" 大错特错! Git 是有历史记录的,黑客有专门的机器人 24 小时盯着 GitHub,一旦发现有密钥提交,几秒钟内就会被抓取。只要提交过一次,这个密钥就彻底废了。唯一的解决办法就是:立刻去云服务商那里把这个密钥作废(Revoke),重新生成一个新的!

7. Properties (.properties)

(1)认识 Properties

  • 标签: Java 的老家,稳如老狗的骨灰级选手。

  • 特点:

    • 极致扁平: 和 INI 一样,它没有任何嵌套层级,通篇都是纯粹的键值对。

    • Java 原生血统: 它是 Java 语言自带的标准配置格式(java.util.Properties 类原生支持解析),不需要引入任何第三方包就能读。

    • 文件后缀: 虽然最常见的是 .properties,但有时候为了区分不同环境,你会看到 application-dev.properties 这种名字。

  • 作用: 传统 Java Web 工程的主配置、早期的 Spring Boot 项目、多语言国际化(i18n)资源文件(比如用来存界面上的中文版和英文版翻译)。

(2)用"点"打天下的扁平化嵌套

你可能会问:既然它不支持像 JSON 或 YAML 那样的层级嵌套,那如果我想表达"数据库下的 MySQL 下的端口号",该怎么办呢?

Properties 的做法非常简单粗暴------硬接! 它通过在键名中加入英文句号 .,人为制造出一种"视觉上的嵌套结构"。

常见写法演示:

服务器基础配置

server.port=8080

server.servlet.context-path=/api

数据库连接池配置

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.url=jdbc:mysql://localhost:3306/mydb

spring.datasource.username=root

spring.datasource.password=123456

线程池配置

thread.pool.max=50

thread.pool.min=10

效果预览: 虽然没有大括号和缩进,但通过 server.xxxspring.datasource.xxx 这种长长的前缀,依然能把配置项归类得清清楚楚。

(3)Properties 语法与天坑速成

Properties 的语法看起来连小白都能写,但它却藏着整个配置文件界最让人抓狂的一个终极天坑。以下是你必须了解的 4 个核心点:

用法一:宽容的键值对分割符

除了最标准的等号 = 之外,它竟然还支持用冒号 : 或者直接用空格来分割键和值!

用法一:宽容的键值对分割符

这三种写法在 Properties 看来是完全一样的!

user.name=admin

user.name:admin

user.name admin

避坑建议:为了人类能看懂,请老老实实统一使用等号 =

用法二:两种注释符号

它支持使用井号 #,也支持使用感叹号 ! 作为注释的开头。

用法二:两种注释符号

这是用井号写的注释

! 这也是合法的注释

用法三:折行符(太长了换个行)

如果一个值非常长(比如一段 SQL 语句或者长串密钥),你可以用反斜杠 \ 把一行字分拆到多行去写,程序读取时会自动把它们拼起来。

用法三:折行符(太长了换个行)

long.message=Hello, \

this is a very long \

string written in multiple lines.

用法四:中文乱码(史诗级天坑⚠️)

这是所有 Java 程序员初学时必踩的坑。早期的 Java 规范规定,.properties 文件必须使用 ISO-8859-1 编码 (这是一种只支持英文字母的古老编码)。 如果你直接在文件里写中文,程序读出来全是一堆问号 ????

过去怎么解决? 程序员必须用工具把中文转成 Unicode 编码形式:

用法四:中文乱码(史诗级天坑⚠️)

你想写:系统错误

error.message=\u7cfb\u7edf\u9519\u8bef

随着时代的进步,现在的开发工具(比如 IDEA)和现代化的框架(比如高版本的 Spring Boot),都已经具备了**"透明转码"**或直接支持 UTF-8 的功能。你在编辑器里看到的是正常中文,编辑器会在底层自动帮你处理好编码问题。

"正因为 Properties 前缀太长(每次都要写 spring.datasource.xxx 写到手酸),而且历史上的中文乱码问题太吓人,现在的 Spring Boot 开发者们已经集体'叛逃',纷纷把主配置文件改成了 YAML (即 application.yml)。但作为一代经典,Properties 依然在无数底层框架中默默发光发热。"

8. HCL (.hcl)

(1)认识 HCL

  • 标签: 运维界的"建筑图纸",基础设施即代码(IaC)的绝对霸主。

  • 特点:

    • 全称: HashiCorp Configuration Language(HashiCorp 公司发明的配置语言)。

    • 介于数据与代码之间: 它比 JSON 和 YAML 具有更强的逻辑表达能力(支持变量、函数、循环计算),但又比纯正的 Python 或 JS 更加结构化、限制更严。

    • 人类与机器的双赢: 它的设计初衷就是"既要让人类一眼看懂架构,又要让机器无缝解析"。

  • 作用: 它是鼎鼎大名的 Terraform 的核心语言。专门用来向阿里云、腾讯云、AWS 等云厂商发号施令,全自动地购买服务器、配置数据库、划分子网、设置防火墙。

(2)基础设施即代码 (IaC)

你可能会问:我要买台服务器,去阿里云后台点几下鼠标不就行了,为什么要专门写个代码配置?

想象一下,你的公司要在海外上线一个新项目,需要配置 50 台服务器、3 个负载均衡、2 个集群数据库。如果靠人工去点鼠标,不仅要点一整天,万一点错一个防火墙端口,整个系统就瘫痪了。

这时候,你只需要写一份 HCL 文件,敲一行命令 terraform apply,去喝杯咖啡,回来时所有的云端机器都已经按照"图纸"完美建好了!这就叫**"基础设施即代码 (IaC)"**。

常见写法演示:

1. 声明我们要指挥的云厂商(比如 AWS)

provider "aws" {

region = "ap-northeast-1" # 部署在东京机房

}

2. 声明一个资源:给我创建一台虚拟服务器(EC2)

resource "aws_instance" "my_web_server" {

ami = "ami-0abcdef1234567890" # 镜像编号 (比如 Ubuntu 系统)

instance_type = "t2.micro" # 机器配置 (1核1G)

打上标签,方便管理

tags = {

Name = "My-Awesome-Blog-Server"

Env = "Production"

}

}

效果预览: 结构极其清晰,通过 providerresource 等核心"块(Block)",像搭乐高一样把云端的硬件资源给描述了出来。

(3)HCL 语法与避坑速成

HCL 是一种强目的性的领域特定语言(DSL),它的语法非常有特色。以下是编写 HCL 时必须掌握的核心逻辑:

用法一:块(Blocks)------ 架构的基本单元

HCL 的核心结构就是"块"。一个块包含:块类型 (如 resource)、标签 (可能有零个或多个,如上面的 "aws_instance""my_web_server"),以及用花括号 {} 包裹的主体。

用法一:块(Blocks)------ 架构的基本单元

块类型 标签1 (资源种类) 标签2 (自定义名字)

resource "alicloud_db_instance" "my_mysql" {

engine = "MySQL"

}

用法二:参数(Arguments)与 JSON 兼容

块内部就是 键 = 值 的参数。HCL 实际上与 JSON 是100% 双向兼容的!如果你真的受不了 HCL,Terraform 允许你直接传入一段 JSON 文件来代替。

用法二:参数(Arguments)与 JSON 兼容

内部的赋值非常直观,支持字符串、数字、布尔、列表和映射(Map)

is_active = true

ports = [80, 443]

用法三:插值与动态引用(神级功能)

这是它吊打普通静态配置文件的地方。在 HCL 里,你可以使用 ${ ... } 语法,让一个资源的配置去动态读取另一个资源的输出结果

用法三:插值与动态引用(神级功能)

resource "aws_vpc" "my_network" {

cidr_block = "10.0.0.0/16"

}

resource "aws_subnet" "my_subnet" {

这里的 vpc_id 必须等上面的网络创建好才能知道。

通过动态引用,HCL 会自动帮你搞定等待和提取!

vpc_id = aws_vpc.my_network.id

}

用法四:图依赖执行(天坑警告⚠️)

很多新手写 HCL 会踩进一个思维误区:以为代码是从上往下按顺序执行的。

那就大错特错! HCL 是声明式 的。Terraform 读取文件后,会根据变量引用关系,在内部画一张"有向无环图 (DAG)"。如果 A 资源依赖 B 资源,哪怕你把 A 写在文件的最上面,它也会乖乖等 B 创建完再创建 A。 避坑指南:千万不要人为制造"循环依赖"(A 依赖 B,B 依赖 A),否则系统会直接崩溃罢工。

警惕:

不论是保护密码的 .env,还是操控云资源的 .hcl,它们都在向我们传递一个事实:配置文件早已不是程序的附庸,它们正在独立成为决定系统架构生死存亡的"最高指挥官。

三、服务与系统(侧重架构)

9. Conf (.conf)

(1)认识 Conf

  • 标签: 服务器之魂,运维人的日与夜。

  • 特点:

    • 全称: Configuration File(配置文件)。

    • 最大的特点就是"没有绝对的标准": 这是它和其他格式最大的区别!JSON 和 YAML 都有全球统一的语法规范,但 .conf 并没有。每个软件都有自己规定的一套 .conf 写法。

    • 基于纯文本: 通常以空格、制表符分隔键值对,或者用大括号 {} 划分层级。

    • 原生支持注释: 绝大多数情况使用井号 # 作为注释。

  • 作用: Linux 系统的底层配置(存放在 /etc/ 目录下)、Nginx(反向代理/Web服务器)、Apache、Redis(内存数据库)、各种传统的 C/C++ 后端服务。

(2)掌控流量与系统命脉

在 Web 开发中,.conf 出镜率最高的地方绝对是 Nginx 。当你敲下一个网址(比如 [www.baidu.com](https://www.baidu.com)),请求到达服务器后,就是由 Nginx 的 .conf 文件来决定:这个请求该转发给哪台机器?该返回哪个静态页面?要不要拦截恶意的 IP?

它可以说是整个互联网架构的"交通警察"。

常见写法演示(以最经典的 Nginx 为例):

这是一个经典的 Nginx Web 服务器配置

user nginx;

worker_processes auto; # 自动分配工作进程

events {

worker_connections 1024; # 每个进程允许的最大连接数

}

http {

include /etc/nginx/mime.types;

default_type application/octet-stream;

定义一个虚拟主机(网站)

server {

listen 80; # 监听 80 端口

server_name www.myblog.com; # 绑定的域名

当用户访问根目录时的路由规则

location / {

root /usr/share/nginx/html; # 静态文件存放的目录

index index.html index.htm; # 默认首页

}

拦截特定错误码并显示自定义页面

error_page 500 502 503 504 /50x.html;

}

}

效果预览: 它的层级结构非常像一段传统的编程代码,靠大括号 {} 划分作用域(块),靠缩进保持美观。

(3)Conf 语法与避坑速成

因为 .conf 没有绝对的通用标准,所以我们重点讲讲它最主流代表(Nginx 和传统 Linux 服务)的核心语法与天坑:

用法一:门派林立的写法(必须看官方文档)

不同的软件,.conf 长得完全不一样!你不能用写 Nginx 的经验去写 Apache。

  1. Nginx 派: 喜欢用 {} 分块,用 ; 结尾。

  2. Apache 派: 喜欢用类似 XML 的标签,比如 <VirtualHost *:80> ... </VirtualHost>

  3. Redis 派: 喜欢极其直白的空格分割,比如 port 6379,没有大括号,也没有标签。

用法二:分号地狱(Nginx 专属天坑⚠️)

这是无数新手运维工程师的噩梦。在 Nginx 的 .conf 中,每一条非区块(不在 {} 末尾)的指令,最后必须、绝对要加上分号 ;

用法二:分号地狱(Nginx 专属天坑⚠️)

正确

server_name example.com;

错误(漏了分号,重启 Nginx 时直接全盘崩溃罢工)

server_name example.com

用法三:强大的模块化(Include 指令)

如果一家公司有 100 个网站,把所有配置写在一个 .conf 里会有几万行,根本没法维护。绝大多数 .conf 都支持 include 语法,就像拼图一样把配置拆开。

用法三:强大的模块化(Include 指令)

http {

把 conf.d 文件夹下所有的 .conf 文件都自动加载进来!

这样每个网站就可以拥有自己独立的配置文件了

include /etc/nginx/conf.d/*.conf;

}

用法四:上下文(Context)作用域

在带 {}.conf 中,指令写在哪里非常重要。写在 http {} 块里的配置对所有网站生效,写在 server {} 块里的只对当前域名生效。如果你把只允许在 server 里写的指令写到了外面,解析器就会报错。

.conf 文件最大的痛苦在于:编辑器很难帮你排错!

因为它没有统一的 Schema(像 XML 那样),IDE 往往不知道你拼错的那个单词究竟是合法的自定义变量,还是致命的语法错误。每次修改完 nginx.conf,老手们都会条件反射般地敲下一行命令:nginx -t(测试配置文件语法是否正确),看到绿色的 successful 才敢真正重启服务。

10. Protobuf (.proto)

(1)认识 Protobuf

  • 标签: 性能怪兽,微服务通信的终极契约。

  • 特点:

    • 全称: Protocol Buffers(由 Google 开发)。

    • 非纯文本配置: 注意!.proto 文件本身是人类可读的文本,但它的宿命是被编译成极其紧凑的二进制数据。它不是用来在软件运行时读取的,而是用来"定义数据长什么样"的。

    • 极其小巧与极速: 因为是二进制传输,它的体积往往只有 JSON 的十分之一到三分之一,解析速度更是能快上几十倍。

    • 强类型契约: 所有字段必须严格声明类型(如 int32, string, bool),绝不允许含糊。

  • 作用: 几乎统治了所有高性能后端的内部通信(尤其是 gRPC 框架)。在物联网(IoT)、高频交易、以及复杂的机器人底盘与上层视觉算法中心(比如边缘计算板卡)的内部数据交互中,它是绝对的首选。

(2)跨语言的"接口说明书"

我们前面说 JSON 是"跨语言的通用货币",但 JSON 有个缺点:没法强制约束数据格式 。比如你期望收到一个数字 100,结果对方发来一个字符串 "100",你的程序可能就崩了。

Protobuf 彻底解决了这个问题。假设你有一套系统,视觉处理层用 Python 写,底盘运动控制层用 C++ 写。你们双方只需共同维护一份 .proto 文件,然后各自用编译器生成自己语言的代码。以后互相发消息,数据不仅极度安全,还自带方法提示!

常见写法演示:

// 声明使用第 3 版语法

syntax = "proto3";

// 定义一个相机的基础信息结构

message CameraInfo {

string interface_type = 1; // 接口类型,例如:"csi"

int32 resolution_width = 2;

int32 resolution_height = 3;

}

// 定义机器人遥测数据结构

message RobotTelemetry {

string model = 1; // 机器人型号,例如:"mi2026"

string gait_status = 2; // 当前步态阶段,例如:"waiting"

bool lidar_stealth = 3; // 是否开启激光雷达隐蔽导航

// 嵌套复用上面定义的 CameraInfo

CameraInfo camera = 4;

}

效果预览: 看着非常像是在写 Java 或者 C++ 的实体类(Class)。它清晰地定义了每一个字段的名字、类型,甚至可以直接嵌套其他的 message

(3)Protobuf 语法与天坑速成

.proto 文件并不难,但它有一个和其他所有格式都不同的、极其容易让新手掉坑的核心机制:

用法一:数字编号(绝对的灵魂)

你看上面的代码里,每个字段后面都有个 = 1, = 2天坑警告:这绝对不是给变量赋初始值! 这是该字段在二进制数据中的唯一内存标识符(Tag) 。Protobuf 为了压缩体积,在网络传输时根本不会把字段名(如 model, gait_status)传过去,它只传编号!

  • 规则 1:同一个 message 里,编号绝对不能重复。

  • 规则 2:1 到 15 的编号在二进制里只占 1 个字节,最省空间。所以一定要把最常用、最核心的字段编号排在 1-15。

用法二:声明数据类型

它支持非常丰富的底层数据类型,比如 double, float, int32, int64, bool, string, bytes。这种强类型的约束,让跨语言序列化变得无比安全。

用法三:数组与列表(使用 repeated

如果你想表达一个列表(比如 JSON 里的 []),在 Protobuf 中需要使用 repeated 关键字。

// 用法三:数组与列表(使用 repeated

message SensorData {

// 这代表一个包含多个浮点数的数组

repeated float distance_measurements = 1;

}

用法四:向前兼容的魔法(千万别乱改编号)

假设你的项目上线了,你想删掉 .proto 里的某个旧字段。 绝对不能直接把旧字段删掉,然后把它的编号让给新字段!

如果旧客户端还在发编号为 2 的数据,而新服务端以为编号 2 是另一个新类型,系统直接就乱套了。 正确的做法是使用 reserved 关键字,把那个编号"永远封印"。

// 用法四:向前兼容的魔法(千万别乱改编号)

message OldMessage {

reserved 2, 5 to 8; // 封印这些编号,任何人都不许再用

reserved "old_field_name"; // 名字也可以封印

}


11. REG (.reg)

(1)认识 REG

  • 标签: Windows 的神经中枢,系统底层的黑客钥匙。

  • 特点:

    • 全称: Registry Entries(注册表项文件)。

    • 非传统配置文件: 它不像 JSON 那样被某个软件在运行时持续读取。它是 Windows 庞大"注册表数据库"的导出和导入脚本 。当你双击运行一个 .reg 文件时,它的内容会被瞬间**合并(Merge)**到系统底层数据库中。

    • 树状层级: 它的结构极其像电脑里的文件夹(路径),层层递进。

    • 高风险性: 修改普通配置文件改错了,顶多软件打不开;如果把注册表核心项改错了,Windows 系统可能会直接蓝屏死机!

  • 作用: 给 Windows 右键菜单添加快捷选项(比如"用 VS Code 打开")、修改系统隐藏 UI(比如去掉快捷方式的小箭头)、关闭烦人的系统更新、破解/修改单机游戏的初始金币、绿化免安装软件的环境注入。

(2)给操作系统"打点滴"

在 Windows 世界里,几乎所有的软件设置、硬件驱动信息、用户习惯,都存在一个叫"注册表"的巨大黑盒子里。

如果你想写一个脚本,一键把电脑改造成你最顺手的开发机(比如关掉休眠、显示隐藏文件、修改默认浏览器),你不需要手动去点几十次控制面板,只需要写一份 .reg 文件,双击运行,1 秒钟就能完成所有的底层注入。

常见写法演示:

Windows Registry Editor Version 5.00

; 这是一个给系统添加自定义配置的示例

HKEY_CURRENT_USER\\Software\\MyAwesomeStudio\\MyGame

"PlayerName"="SuperGeek"

"GraphicLevel"=dword:00000002

"FullScreen"="True"

; 修改系统设置:让文件资源管理器显示隐藏文件

HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced

"Hidden"=dword:00000001

效果预览: 看着非常像 INI 文件,对吧?中括号 [ ] 里面是一长串的路径,下面紧跟着要修改的键和值。

(3)REG 语法与高阶玩法(极客必会)

.reg 文件有一套非常严格的"八股文"格式,错一个字都无法导入。以下是它的核心语法和一些非常实用的黑客技巧:

用法一:windows声明(绝对不能漏)

在任何 .reg 文件的第一行,必须、绝对要原封不动地写上这一句声明,否则 Windows 会拒绝识别:

用法一:windows声明(绝对不能漏)

Windows Registry Editor Version 5.00

(注意:这行声明和下面的配置内容之间,通常需要空一行。)

用法二:五大根键(寻找老巢)

所有的中括号 [ ] 路径,都必须以 Windows 的五大根键之一开头。最常用的两个是:

  1. HKEY_CURRENT_USER (HKCU):只影响当前登录的账号(比较安全,最常用)。

  2. HKEY_LOCAL_MACHINE (HKLM):影响整台电脑的所有用户(需要管理员权限,很危险)。

  3. HKEY_CLASSES_ROOT (**HKCR):**文件关联、注册表类、右键菜单、程序打开方式

  4. HKEY_USERS (HKU): 电脑所有用户的配置合集(HKCU 是它的子项)

  5. HKEY_CURRENT_CONFIG (**HKCC):**当前硬件即时配置(显卡、显示器、硬件参数等动态信息)

用法三:数据类型的花样(Dword 和 Hex)

和 INI 全是字符串不同,注册表里有非常底层的数据类型。

  1. 字符串: 用双引号包裹 "Value" = "Hello"

  2. DWORD (32位数字): 前面必须加 dword:,并且后面跟的是 8位十六进制数 !比如十进制的 1,要写成 dword:00000001

  3. 二进制数据:hex: 开头,后面是一串字节码。

用法四:一键删除的魔法(减号 -

如果你双击运行 .reg 是为了删掉 某个流氓软件留在注册表里的垃圾,该怎么写?非常简单,用一个减号 -

删掉整个文件夹(路径项): 在左中括号后面加个 -

; 用法四:一键删除的魔法(减号 -

; 这会直接删掉 MyBadApp 整个配置目录

-HKEY_CURRENT_USER\\Software\\MyBadApp

删掉某个具体的值: 在等号后面直接写 -

HKEY_CURRENT_USER\\Software\\MyGame

"AdsEnabled"=- ; 这会把 AdsEnabled 这个键给彻底删掉

注意:

注册表是 Windows 的灵魂,也是无数'电脑维修员'的提款机。在你决定双击运行任何一个从网上下载的、来路不明的 .reg 文件之前,请务必右键 -> 用记事本打开它,看看它到底想修改哪个路径。如果是修改 HKEY_LOCAL_MACHINE\SYSTEM 相关的项,请立刻停止,并做好系统备份,否则重启后迎接你的可能就是一个大大的蓝脸 ☹️。

四、文本与脚本(动态配置)

12. Markdown (.md)

(1)认识 Markdown

  • 标签: 文档即配置,程序员的"Word"。

  • 特点:

    • 极简主义: 它是一种"轻量级标记语言",纯文本格式。你只需要在文字前后加几个简单的符号(比如 #*),就能完成排版。

    • 所见即所得: 哪怕没有专门的渲染软件,直接看 .md 源码也能轻松读懂(不像 XML 满屏都是标签)。

    • 跨平台霸主: GitHub、知乎、简书、Notion,甚至 ChatGPT 的输出,底层全是 Markdown。

  • 作用: 写项目说明书(README.md)、写博客文章、记个人笔记。

(2)Front Matter

你可能会问:Markdown 不是写文章的吗,怎么混进配置文件的队伍里了?

这就是它的"跨界"绝活。在静态博客系统(比如 Hexo, Hugo, VuePress)中,一篇 .md 文章的开头通常会有一块特殊的区域,叫做 Front Matter(前置数据)

这部分内容夹在两行 --- 之间,通常使用 YAML 格式(我们后续会讲到)编写。它不属于文章正文,而是专门给博客系统看的配置信息

常见写法演示:


title: 为什么程序员永远在折腾缩进和括号? # 文章标题

date: 2026-05-20 13:14:52 # 发布日期

tags: [编程, 配置文件, 吐槽] # 标签列表,用于分类和搜索

categories: 技术随笔 # 文章分类

draft: false # 是否为草稿(false 表示已发布)


这里才是正文的开始

在这个数字化的时代,配置文件的演进史就是一部血泪史......

效果预览:

(3)Markdown 语法速成

Markdown 的设计理念就是"不让鼠标打断你的打字心流"。以下是你日常写作最常用的 6 个用法:

用法一:标题(用 # 搞定层级)

在文字前面加 # 号和一个空格,就能变成标题。1个 # 是最大标题,以此类推,最多支持 6 级。

用法一

下面示例展示 Markdown 标题与对应的 HTML 标签:

  • `#` 表示一级标题,等同于 `<h1>`

  • `##` 表示二级标题,等同于 `<h2>`

  • `###` 表示三级标题,等同于 `<h3>`

示例:

这一行是一级标题

这一行是二级标题

这一行是三级标题

效果预览:

用法二:强调文本(用 * 画重点)

不用再去点工具栏的"B"和"I"了。

用法二

这是普通文字。

**这是加粗文字**(两边各两个星号)

*这是斜体文字*(两边各一个星号)

***这是加粗又斜体的文字***(两边各三个星号)

~~这是带删除线的文字~~(两边各两个波浪号)

效果预览:

用法三:列表(用 - 和数字整理逻辑)

无序列表:-+* 加一个空格。

有序列表: 直接用数字加英文句点和一个空格。

用法三

  • 苹果

* 香蕉

  • 橘子
  1. 把冰箱门打开

  2. 把大象装进去

  3. 把冰箱门关上

效果预览:

用法四:代码块(程序员的灵魂)

行内代码: 如果在句子里提到某个单词,用反引号 ````` 包起来。

用法四

在这个项目中,我们使用了 `JSON` 格式。

多行代码段: 用三个反引号 ``` 上下包围,还可以在第一行指定编程语言来获得高亮!

```python

print("Hello, World!")

def hello():

pass

```

效果预览:

用法五:引用(用 > 借用别人的话)

如果在文章里引用名人名言或者官方文档,在行首加一个 > 和空格。

用法五

> 优秀的程序员不是不写 bug,而是能最快找到 bug 的人。 ------ 某不愿意透露姓名的开发者

效果预览:

用法六:插入链接和图片

这俩语法很像,图片只是在前面多了一个叹号 !。格式都是:[显示的文字](真实的网络地址)。

点击访问我的 GitHub 主页\](https://github.com) !\[这是图片加载失败时显示的文字\](https://example.com/my-image.jpg)

效果预览:

13. JavaScript (.js / .mjs)

(1)认识 JS 脚本配置

  • 标签: 前端基建狂魔,图灵完备的动态管家。

  • 特点:

    • 图灵完备: 它是正儿八经的编程语言。你的配置文件里可以写 if/else 条件判断、可以写 for 循环,甚至可以发起网络请求、读取系统本地文件。

    • 按需动态计算: 静态的 JSON 写了 8080 端口,就永远是 8080。但 JS 配置可以在运行时去检查你电脑的 8080 端口有没有被占用,如果被占用了,它能自动帮你换成 8081

    • 生态高度绑定: 它几乎垄断了所有的前端工具链,但也仅仅局限于 Node.js 和前端生态中。

  • 作用: 现代前端工程化的绝对核心 。无论是打包工具(如 Webpack 的 webpack.config.js,Vite 的 vite.config.js),还是代码规范校验(ESLint),或者是 UI 样式框架(Tailwind CSS),底层清一色是用它做配置。

  • JS 和 MJS 写法 99% 一样,唯一区别就是:模块化规则不同!

    一句话总结:

    • .js = 老规矩(CommonJS,用 require / module.exports
    • .mjs = 新规矩(ES 模块,用 import / export

(2)逻辑即配置

想象一个典型的开发场景: 你在本地开发时,需要开启"热更新"功能,并且不压缩代码以便调试;但当你要把代码打包发布到线上时,你必须关闭热更新,并且开启最高级别的代码压缩。

如果用 JSON 写,你必须建两个文件:config.dev.jsonconfig.prod.json。但如果用 JavaScript,你只需要一份代码,让它自己去"思考"当前该输出什么配置!

常见写法演示(以构建工具为例):

// 引入 Node.js 的内置模块,用来处理文件路径

const path = require('path');

// 核心魔法:动态判断当前系统的环境变量,看是不是"生产环境"

const isProduction = process.env.NODE_ENV === 'production';

// 导出一个配置对象给构建工具使用

module.exports = {

// 动态决定打包模式:线上用 production,本地用 development

mode: isProduction ? 'production' : 'development',

// 入口文件

entry: './src/main.js',

// 动态组装插件:如果是在生产环境,才加入"代码压缩(Terser)"功能

plugins: [

new HTMLWebpackPlugin(),

...(isProduction ? [new TerserPlugin()] : []) // 只有生产环境才执行这行

]

};

效果预览: 那个 ...(isProduction ? ...) 的三元表达式,就是静态文件永远做不到的魔法。系统运行这个 JS 文件时,它会当场计算出一个完美的配置对象交给底层去执行。

(3)JS 配置语法

把编程语言当配置文件用,虽然极其灵活,但在语法上有一个让所有前端新手(甚至老手)都崩溃的天坑:导出流派之争(CommonJS vs ESM)

1. 核心死穴:两种完全不同的导出规范

.js 配置文件,最容易遇到全屏飘红报错,通常是因为语法规范混用了。目前有两套绝对不能混搭的标准:

规范 A:CommonJS (传统 Node.js 规范)

  • 适用场景: Webpack、Babel、旧版 Node.js 项目。

  • 语法特征: 导入用 require(),导出用 module.exports

  • 文件后缀: 默认是 .js,严格区分时用 .cjs

// 引入外部依赖

const path = require('path');

// 导出一个对象作为配置

module.exports = {

entry: './src/index.js',

outDir: path.resolve(__dirname, 'dist'),

port: 8080

};

规范 B:ESM (现代前端规范)

  • 适用场景: Vite、Rollup、最新的前端框架脚手架。

  • 语法特征: 导入用 import,导出用 export default

  • 前提条件: 后缀名得是 .mjs,或者在项目的 package.json 里写了 "type": "module"

// 引入外部依赖

import path from 'path';

// 导出一个对象作为配置

export default {

entry: './src/index.js',

outDir: path.resolve('dist'),

port: 8080

};

2. 实际用法:JS 配置能干什么 JSON 干不了的事?

用 JS 写配置,核心目的只有三个:

用法一:根据环境变量,动态改变配置

这是最常见的场景。一份配置文件,开发时是一套参数,部署上线时自动切成另一套。

// 用法一:根据环境变量,动态改变配置

// 读取操作系统的环境变量

const isProd = process.env.NODE_ENV === 'production';

module.exports = {

// 如果是线上环境,用 80 端口,否则用 8080

port: isProd ? 80 : 8080,

// 线上环境开启代码压缩,本地开发关闭

minify: isProd ? true : false

};

用法二:用代码逻辑生成重复配置

假设你需要配置 10 个代理服务器地址,如果是 JSON 你得手写 10 遍。在 JS 里,写个循环就完事了。

// 用法二:用代码逻辑生成重复配置

const proxyList = {};

// 动态生成 10 个代理配置

for (let i = 1; i <= 10; i++) {

proxyList[`/api/v{i}\`\] = \`http://server-{i}.com`;

}

module.exports = {

proxies: proxyList

};

用法三:调用系统 API 处理复杂路径

JSON 只能写死路径(比如 C:/project/dist),换台电脑可能就报错了。JS 配置可以调用内置的 path 模块,自动根据当前电脑的目录结构计算绝对路径。

// 用法三:调用系统 API 处理复杂路径

const path = require('path');

module.exports = {

// __dirname 代表当前文件所在的目录

// 无论谁下载这份代码,生成的路径永远是对的

buildPath: path.join(__dirname, 'build', 'assets')

};

.js 配置文件本质上就是一个普通的 JS 文件,核心规则就两条:

  1. 看清楚项目要求用 require 还是 import

  2. 确保文件最后导出了一个对象(Object)。

14.TypeScript (.ts)

(1)认识 TS 脚本配置

  • 标签: 强类型守护者,编辑器里的"预言家"。

  • 特点:

    • JS 的超集: 它完全兼容 JavaScript 的所有语法,但额外增加了一套严格的类型系统

    • 绝对的代码提示: 这是它作为配置文件最大的杀手锏!在编辑器(如 VS Code)里,你不需要去查官方文档,敲下一个空格,编辑器就会自动把所有支持的配置项弹出来让你选。

    • 提前排雷: 如果你把配置项的名字拼错了,或者该填数字的地方填了字符串,代码下面立刻会亮起红线,根本不用等到运行阶段才报错

  • 作用: 几乎所有现代前端工具的首选配置格式。Vite (vite.config.ts)、Next.js、现代的 Webpack 和 Rollup,都在疯狂拥抱它。

(2)告别"盲人摸象"

我们回想一下写 .js 配置最大的痛点是什么? 假设你要配置一个 Webpack 插件,它的配置对象有几十个参数。在 .js 里,你只能凭记忆或者一边盯着官方文档,一边在编辑器里手敲。如果把 compress: true 拼成了 compres: true,JS 根本不知道你写错了,直到你打包失败才能发现。

但在 .ts 中,体验是降维打击的:

常见写法演示(以现代构建工具 Vite 为例):

// 引入类型推导魔法函数 defineConfig

import { defineConfig } from 'vite';

import vue from '@vitejs/plugin-vue';

// 使用 defineConfig 包裹配置对象

export default defineConfig({

// 当你在里面输入 s,编辑器会自动提示 server

server: {

port: 3000,

// 如果你在这里把 open 错拼成 opn,底下会立刻出现红线报错!

open: true,

},

plugins: [vue()]

});

效果预览: 看起来和纯 JS 几乎一模一样,对吧?魔法都藏在那个 defineConfig 函数里。它在底层告诉了编辑器:"这个大括号里的所有内容,必须符合 Vite 配置的规范!"

(3)TS 配置语法与天坑速成

写 TS 配置超级爽,但它的环境配置却有一点门槛。以下是核心用法与最大的天坑:

用法一:神仙辅助 defineConfig

在没有 defineConfig 之前,写 TS 配置需要手动引入长长的类型接口,像这样:

// 用法一:神仙辅助 defineConfig

import type { UserConfig } from 'vite';

const config: UserConfig = { ... }

export default config;

现在,绝大多数支持 TS 配置的框架都提供了 defineConfig。它的作用只有一个:不用你写繁琐的类型声明,只要用它把对象包起来,就能自动获得完美的类型提示。

用法二:联合类型(帮你做选择题)

有时候一个配置项只能填几个特定的词(比如环境只能是 developmentproduction)。在 JS 里你填个 test 也不会报错,但在 TS 里:

// 用法二:联合类型(帮你做选择题)

// 类型定义:type Mode = 'development' | 'production'

export default defineConfig({

mode: 'test', // ❌ 红线报错:类型""test""不能赋值给类型""development" | "production""

})

天坑:运行环境的羁绊(Node 不认识它!) 这是 TS 配置文件唯一的、也是最大的痛点 。 你在电脑上装的 Node.js 运行环境,原生是不懂 TypeScript 的! 它只认 .js

如果你自己随便建一个 config.ts,然后用 Node 去运行它,会直接报错语法错误。 那为什么 Vite 这些工具能用 .ts 做配置? 因为这些现代工具在底层悄悄内置了像 esbuild 这样的极速转换器。当你启动项目时,Vite 会在 0.1 秒内在内存里把你的 .ts 配置编译成 .js,然后再交给 Node 去执行。

避坑指南: 如果你的老项目(比如老版 Webpack)本身不支持读取 TS 配置,你需要手动安装 ts-node 等工具,并在启动命令里做额外拦截,非常折腾。

(4)Vue和React应用的区别

1. Vue 的配置生态:天下一统,极度舒适

Vue 官方对工具链的掌控力极强。从早期的 Vue CLI 到现在的 Vite,官方都给你铺好了路,主打一个"开箱即用,配置扁平"。

现代 Vue 标配:vite.config.ts

现在写 Vue 3,几乎清一色都是 Vite。它的配置文件特征是极度依赖官方插件

// Vue 项目典型的 vite.config.ts

import { defineConfig } from 'vite'

import vue from '@vitejs/plugin-vue' // 核心:官方提供的 Vue 插件

import path from 'path'

export default defineConfig({

// 只需要把 vue() 插件塞进去,Vite 就瞬间懂了怎么解析 .vue 文件

plugins: [vue()],

resolve: {

alias: {

'@': path.resolve(__dirname, './src') // 配置一个 @ 指向 src 目录,这是 Vue 人的祖传习惯

}

}

})

Vue 配置的核心痛点: 几乎没有。官方把脏活累活全在底层干完了,你只需要填几个基础参数。

2. React 的配置生态:百家争鸣,疯狂折腾

React 官方只管核心视图层,对构建工具链是"放养"状态。这导致 React 项目的配置极其割裂,分成了三大流派:

流派 A:官方老牌脚手架 CRA (Create React App) ------ "不让你配"

如果你用 CRA 创建项目,你会发现根目录下根本没有 Webpack 配置文件 。React 官方为了不让新手头疼,把几千行的配置全隐藏在 node_modules 里了。

  • 你想改配置怎么办?

    1. 强行 npm run eject:把隐藏的 Webpack 配置全吐出来,整个项目瞬间多出几十个文件,极度吓人,且不可逆。

    2. 用第三方补丁(比如 craco.config.js):通过"猴子补丁"的方式去强行覆盖底层的配置。这非常痛苦,经常因为版本不兼容报错。

流派 B:现代全栈大哥 Next.js ------ "按我的规矩配"

现在写 React 绕不开 Next.js,它的配置文件叫 next.config.mjs。它不让你碰底层的Webpack/Turbopack,而是提供了一套自己独有的 API。

// React/Next.js 典型的 next.config.mjs

/** @type {import('next').NextConfig} */

const nextConfig = {

reactStrictMode: true, // React 特有的严格模式开关

// Next.js 极其严格的图片域名白名单配置

images: {

remotePatterns: [

{

protocol: 'https',

hostname: 'assets.example.com',

},

],

},

};

export default nextConfig;

流派 C:叛逃到 Vite ------ "和 Vue 抢地盘"

很多 React 开发者受够了 CRA 的慢和 Next.js 的重,也开始用 Vite。写法和 Vue 极其相似,只是换了个插件。

// React 项目的 vite.config.ts

import { defineConfig } from 'vite'

import react from '@vitejs/plugin-react' // 核心:换成了 React 插件

export default defineConfig({

plugins: [react()],

})

总结:到底哪里不一样?

  1. 掌控权不同: Vue 的配置是"填空题",官方把坑挖好了(vue() 插件),你填就行;React(特别是老项目)的配置是"黑盒逃生",你要么忍受默认配置,要么用 craco 等工具强行破解修改。

  2. 心智负担不同: Vue 开发者只需要学一个 Vite 配置;React 开发者不仅要懂 Webpack(防身),还要懂 Next.js 的专属配置,心智负担极重。

  3. 严格模式: React 的配置里经常会出现 reactStrictMode 这种独有的开关(会导致组件在开发环境下渲染两次),这是 Vue 配置里绝对见不到的。

15. Python (.py)

(1)认识 Python 脚本配置

  • 标签: AI 与后端的调参中枢,最易读的动态管家。

  • 特点:

    • 图灵完备且极度易读: 它是正规的编程语言,支持各种复杂逻辑。但得益于 Python 强制缩进、没有花括号的特性,它的代码看起来非常像一份干净的 YAML 或 TOML 配置文件。

    • 按需动态计算: 可以直接调用底层操作系统 API(如 os, sys),动态读取环境变量、路径、甚至硬件信息。

    • 生态专属: 出了 Python 的圈子,其他语言基本没法直接读取它。

  • 作用: 传统后端框架的主力配置 (如 Django 的 settings.py,Gunicorn 的 gunicorn.conf.py);深度学习与机器人控制的超参数中心;以及各种本地大语言模型(LLM)和 AI 智能体框架的初始化入口。

(2)动态探测与环境感知

在 AI 开发和复杂的服务器部署中,纯粹的静态文件(JSON/YAML)往往显得极其死板。

假设你正在一台个人服务器上部署 Qwen 模型或者开发一个包含视觉算法的机器人项目。你需要让程序自动判断:当前机器到底有没有显卡?权重的存放路径在不同操作系统下该怎么拼接?如果用 JSON,你只能写死参数,换台电脑就报错。而用 Python 写配置,它可以做到"环境自适应"。

常见写法演示(以 AI/算法项目为例):

import os

import torch

魔法 1:动态获取当前配置文件所在的绝对路径,不管项目被拷到哪都不会路径报错

BASE_DIR = os.path.dirname(os.path.abspath(file))

MODEL_DIR = os.path.join(BASE_DIR, "models", "qwen-7b")

魔法 2:动态硬件探测!有 GPU 就用 cuda,没有就降级用 cpu

DEVICE = "cuda" if torch.cuda.is_available() else "cpu"

常规的嵌套字典配置,看起来就像 JSON 一样清晰

SYS_CONFIG = {

"project_name": "AI_Guide_System",

"version": "1.0",

"frameworks": ["PyTorch", "OpenCV"],

"llm_parameters": {

"temperature": 0.7,

"max_tokens": 2048

}

}

效果预览: 配置文件本身就是一个极其聪明的探测器。它不仅定义了参数,还在运行的第一秒钟就把运行环境(硬件、路径)给安排得明明白白。

(3)Python 配置语法与高阶玩法(避坑速成)

在 Python 中写配置,最主流的做法不是像 JS 那样导出一个巨大的 Object,而是有着自己独特的"门派习惯":

用法一:大写全局常量(最简单的流派)

Python 没有 export default 这种东西。你只需要在这个 .py 文件里定义变量,其他文件直接 import 就能用。

行业潜规则:作为配置项的变量名,必须、绝对要全部大写,这是所有 Python 程序员的默契。

用法一:大写全局常量(最简单的流派)

config.py

DEBUG = True

SECRET_KEY = "my_super_secret_key"

PORT = 8080

用法二:面向对象的类继承(高阶必会魔法)

这是 Python 配置的独门绝技!如果你有"本地开发"、"测试"、"线上生产"三套配置,在 Python 里你可以用类的继承来实现极其优雅的参数复用,这在 Flask 和深度学习调参中极度常见。

用法二:面向对象的类继承(高阶必会魔法)

class BaseConfig:

"""所有环境共用的基础配置"""

PROJECT_NAME = "MyProject"

USE_GPU = True

LEARNING_RATE = 0.001

class DevConfig(BaseConfig):

"""开发环境:继承基础配置,但开启调试模式"""

DEBUG = True

DB_URL = "sqlite:///local.db"

class ProdConfig(BaseConfig):

"""生产环境:覆盖掉基础配置中的某些高危选项"""

DEBUG = False

DB_URL = "mysql://admin:pass@127.0.0.1/prod_db"

甚至可以动态读取环境变量来保护密码

SECRET_KEY = os.environ.get("SYS_SECRET_KEY")

相关推荐
AI进化营-智能译站1 天前
Jazzy ROS2入门指南系列05-配置VsCode实现ROS2项目开发
ide·vscode·ai·编辑器
小短腿的代码世界1 天前
Qt量化策略编辑器深度解析:从DSL解析到可视化编排的完整架构
qt·架构·编辑器
咬人喵喵1 天前
五一劳动节 SVG 交互图文案例大全
低代码·微信·编辑器·交互·svg
啾啾啾6661 天前
VScode用cookie登录时,输入cookie值后按回车没反应
ide·vscode·编辑器
Misnice1 天前
Cursor 常用快捷键总结
编辑器
望眼欲穿的程序猿2 天前
苹果系统使用VsCode开发QT
ide·vscode·编辑器
其实防守也摸鱼2 天前
带你了解与配置phpmyadmin
笔记·安全·网络安全·pdf·编辑器·工具·调试
Rsun045512 天前
Oracle中常用语法
编辑器
非黑皆白2 天前
配置Vscode Claude Code 插件使用deepseek-v4-pro模型
ide·vscode·编辑器