BON:JSON 的超集,配置界的 SASS

封面

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)

登录 后发表评论
暂无评论,快来抢沙发吧~