BON:JSON 的超集,配置界的 SASS
为什么会有这个项目
JSON 是最流行的数据交换格式,但用它写配置有个麻烦:不能复用、不能计算、不能继承。
一个 K8s 服务配三个环境——dev、staging、prod——每个环境复制一份。改一个字段要改三处,十个服务就是三十处。YAML 解决了注释问题,但没解决复用和计算。HOCON、TOML 也一样。配置语言这么多年一直在“格式”上做文章,没人从“表达能力”入手。
BON 要解决的就是这个问题。
它是什么
一门编译期执行的声明式数据转换语言,是 JSON 的超集。所有合法 JSON 都是合法 BON。
BON 在 JSON 之上加了模板、类、继承、条件判断、循环、导入这些编程语言才有的东西,然后编译成纯 JSON。宿主程序拿到的是干干净净的 JSON,不需要内置 BON 运行时。
// BON 源码
resources-{"cpu":"250m","memory":"256Mi"}
class Service {
"replicas": 1,
"resources": {resources}
}
{
"dev": Service { "replicas": 1 },
"prod": Service { "replicas": 3 }
}
输出的 JSON:
{
"dev": { "replicas": 1, "resources": {"cpu":"250m","memory":"256Mi"} },
"prod": { "replicas": 3, "resources": {"cpu":"250m","memory":"256Mi"} }
}
能做什么
模板系统:用 template-{ ... } 定义可复用片段,通过 {name} 引用,深拷贝展开,互不干扰。
类与继承:class 定义数据结构,extends 继承,支持属性覆盖和方法继承。计算属性用 self.width * self.height。
条件判断:if/else 编译期分支,支持表达式上下文(必须带 else)和对象块上下文(else 可选)。
循环:for 遍历数组、对象或范围(左闭右开,上限 10000 次),编译期展开。
编译时参数:$var 注入外部值,实现环境差异化配置。未传入参数抛出 E009 错误。
标准库:字符串(upper/lower/trim/split/replace)、数组(map/filter/reduce/concat/at/first/last)、对象(merge/keys/values),全部是纯函数。
导入系统:import "file.bon" as Alias,支持别名和循环导入检测(E008)。
注释:# 和 //,JSON 标准不允许的,BON 支持。
怎么做的
编译流程:参数注入 → 词法/语法分析 → 导入解析 → 控制流展开 → 模板展开 → 常量折叠 → 纯 JSON。
BON 是图灵不完备的——没有无限循环、没有随机数、没有系统时间。相同源码在任何环境编译,输出完全一致。它不会滑向“用配置写业务逻辑”那个方向。
错误处理走 Fail Fast 原则,11 种错误类型(E001–E011),覆盖缺失参数、循环超限、循环导入等常见问题。
使用方式
BON 提供 Python 和 TypeScript 两套实现,语义完全一致。
命令行:
bon config.bon
bon --param env=prod config.bon
bon -e '{"name": "test"}'
代码里调用:
from bon_py.evaluator import load
config = load("config.bon", params={"env": "prod"})
import { load } from "bon-ts";
const config = load("config.bon", { params: { env: "prod" } });
VS Code 扩展提供语法高亮、自动补全、错误诊断、跳转定义。
项目结构
BON/
├── packages/
│ ├── bon-py/ # Python 实现(lexer → parser → evaluator)
│ ├── bon-ts/ # TypeScript 实现(同构)
│ └── bon-vsc-ext/ # VS Code 扩展
├── tests/fixtures/ # 共享测试用例
└── docs/ # VitePress 文档站
Python 和 TypeScript 两套实现共享同一套测试用例,保证行为完全一致。
谁适合用
- 用 K8s 配多环境的
- 维护一堆 Docker Compose 文件的
- 游戏配置表写到吐的
- 微服务之间共享公共配置的
- 任何觉得“JSON 不够用”的人
现状
项目持续开发中。测试覆盖包括单元测试和集成测试,Python 和 TypeScript 两套实现共享测试夹具,保证跨语言一致性。
相关链接
- 项目地址:github.com/TT23XR-Studio/BON/
- KossJS 文档:docss.sxxyrry.qzz.io/BON/
- TT23XR Studio 官网:tt23xr.sxxyrry.qzz.io/
Apache-2.0 许可证,欢迎使用和贡献。
评论 (0)