第 6 章:环境变量与转义
第 6 章:环境变量与转义
本章讲两件"让配置更安全、更通用"的小事:环境变量注入和字符串转义。
6.1 环境变量:$env.VAR
配置里常有敏感值(API Key、密码)或随环境变化的值(域名、端口)。把这些写死在文件里既不安全也不灵活。SML 用 $env.VAR 在解析期从环境变量读取:
secrets {
resendApiKey: $env.RESEND_API_KEY
dbPassword: $env.DB_PASSWORD
optionalWebhook: $env.UNSET_WEBHOOK # 未设置 -> 空串,不报错
}
要点:
$env.VAR在解析时就地替换为环境变量的值(替换为字符串)。- 变量未设置时,结果为空串,不会报错(所以可放心写可选项)。
- 这样配置可以安全地提交进版本库,密钥只存在于运行环境的变量中。
等价 JSON 必须把明文写死;SML 让"配置"与"密钥"解耦。
6.2 字符串转义
引号字符串里支持常见转义:
| 转义 | 含义 |
|---|---|
\n |
换行 |
\t |
制表符 |
\\ |
反斜杠本身 |
\" |
引号本身 |
\u{XXXX} / \uXXXX |
Unicode 码点,转为 UTF-8 |
示例:
banner: "SML \u{1F680} 上线 \n第二行\t制表"
label: "雪花 \u{2744} snow"
path: "C:\\Program Files\\app"
\u{2744} 会被解析成雪花字符 ❄。
转义只在引号字符串内生效。裸词(不加引号的值)不支持转义,需要特殊字符就用引号包起来。
6.3 动手试一试
- 写配置引用环境变量:
database { url: $env.DATABASE_URL pool: 16 } - 在运行解析器前设置
DATABASE_URL=postgres://localhost/app,确认解析结果里url被正确填充。 - 试一个带 emoji 的字段:
greeting: "你好 \u{1F44B}"
动手练习
读完本章,在下面的编辑器里直接修改 SML 并点“运行”,立刻看到解析结果或校验错误——有输出才能高效学习。
✍ 动手练习
写一个 secrets 块,含 apiKey: $env.RESEND_API_KEY 与 dbPassword: $env.DB_PASSWORD;再写一个 banner 字符串用 \u{1F680} 转义 emoji。
💡 提示:在浏览器里无法设真实环境变量,所以 $env.X 会解析为空串——这是预期行为,验证也据此判定。
Q1. 把环境变量注入值用哪个语法?
SML 用 $env.NAME 在解析期注入环境变量的值。
Q2. 浏览器里跑 playground 时,$env.X 通常解析成什么?
前端 JS 解析器无法访问真实环境变量,$env.X 取不到时解析为空串,这是预期行为。
Q3. 判断:\u{1F680} 会在字符串里被转义成一个 emoji 字符。
SML 支持 \u{...} 码点转义,\u{1F680} 就是 🚀。
Q4. 下面哪个转义是 SML 支持的?
SML 支持 \n \t \" 等常见转义;\x41 这类 C 风格字节转义不是其标准转义形式。