Jane Street在GitHub上维护的Bonsai,是一套用OCaml写的响应式Web UI框架,公司内部几乎所有网页应用——从员工目录到交易系统的实时监控面板——都跑在它上面。它的卖点很直接:把状态管理、增量计算和页面渲染这三件事拆开,各自单独优化,而不是像React、Elm那样把它们捆进一个"组件"抽象里打包卖给开发者。
这套思路在Jane Street内部已经跑了十几年,但走出公司大门之后,几乎找不到第三方生产案例。一个技术上足够讲究的框架,讲究到只服务一家公司——这才是Bonsai真正值得说的地方,原版GitHub介绍里恰恰没提这一层。
不是横空出世,是十几年内部演进的产物
Bonsai不是某个人一拍脑袋写出来的个人项目,这点和Elm、React不同——后两者都有明确的创造者叙事。Bonsai的技术脉络更像一条接力:Jane Street的工程师Stephen Weeks先做出了增量计算引擎Incremental,公司用它撑起了上一代前端框架incr_dom,Bonsai是incr_dom的继任者。
设计理念上,它承接了Elm的单向数据流和React的组件化思路,但把两者共同依赖的"重新渲染+虚拟DOM diff"模式,换成了增量依赖图:状态变化时,只invalidate图里相关的节点,只重算受影响的那一部分,业务逻辑计算也能享受同样的增量化,不止是视图层。
增量计算赢在交易系统这类场景,但代价是生态几乎为零
React靠虚拟DOM diff压低重渲染成本,Elm靠单一应用循环保证状态可预测,Bonsai靠依赖图节点级的invalidate,理论上重算范围比前两者都小。这对高频更新的交易界面是刚需——数据每秒跳几十次,谁能少算一点,谁的界面就不卡。
但第三方评测把Bonsai和React+TS、ReScript+React、Elm、incr_dom放在一起比较后给出的结论很冷静:Bonsai在性能潜力上表现出色,仅限于交易界面、数据网格、大表单这类特定场景;而在"Jane Street之外的采用率"这一项上,它是所有对比对象里最小的,被列为生态风险最高的一档,明确建议——没有成熟OCaml团队,就别碰。
性能可以为一家公司量身定制,生态没法为一家公司单独存在
- 风险.Bonsai的版本不能独立选择,官方文档要求它和Core、Async、Incremental、Virtual_dom这些Jane Street内部库版本协调一致,需要靠opam show或git ls-remote --tags手动核对,这是任何想上手的团队第一个会踩的坑。
谁值得学,谁不必凑热闹
Bonsai配套的expect-test测试系统确实有亮点:用Handle.create创建句柄、Handle.show_diff比对DOM变化,理论上可以不打开浏览器写完一个组件的完整交互逻辑。但这个便利建立在OCaml类型系统和ppx预处理器的基础上,脱离这套工具链,等于重新学一门语言加一套构建体系。
已经有成熟OCaml团队、且做的是高频动态数据界面(交易看板、实时监控、复杂数据网格)的团队,Bonsai值得认真评估。普通Web团队没有这个前提,为了"增量计算更优雅"去换一整套技术栈,招聘池和第三方组件库都要从零开始,这笔账基本不划算。
Jane Street自己不缺OCaml工程师,也不缺为交易系统UI做毫秒级优化的动机,这是它敢十几年自研前端基础设施的底气。对大多数公司来说,这更像一个可以欣赏、但不必效仿的案例。
