Foldkit 官网上线了,还在 Beta 阶段。这是个用 TypeScript 写的前端框架,底层跑在 Effect 上,架构抄的是 Elm。它不跟 React、Vue、Svelte、Solid 比谁的渲染引擎更聪明,直接把组件、Hooks、本地状态全砍掉——整个应用只剩一个不可变的 Model,一个 update 函数,所有副作用都得以返回值的形式声明出来。

这是用架构纪律换可预测性的赌注。少踩的坑,能不能盖过重写成本、Effect 的学习门槛、React 生态的缺失,官网自己都没把话说满,它专门开了一节叫“What's the catch”。

一个 Model 管到底

Foldkit 的机制很直白:应用状态是一份用 Schema 定义的 Model。任何变化先变成一条 Message,再交给 update 函数处理。处理结果是一对返回值——新的 Model,加上一份要执行的 Command(网络请求、定时器之类的副作用)。

Command 是声明,不是命令式调用,什么时候执行、怎么执行,交给运行时。

Foldkit 核心循环 Message 用户交互/事件 update() 纯函数 新 Model + Command 状态与副作用 每次交互只走这一条线,无隐藏状态,无隐式调用

配套功能给得很齐:类型安全路由(URL 和路由类型双向绑定)、一套按 Elm 架构写的无障碍 UI 组件、可嵌套的 Submodel、把 WebSocket、AudioContext 这类浏览器资源生命周期绑定到 Model 的 Managed Resources、字段级校验、Story/Scene 两套测试原语,还有能时间旅行的 DevTools。

AI 相关的卖点是:代理能通过 MCP 直接连到跑着的 Foldkit 应用,读取当前 Model、翻消息历史、把界面倒回某个过去状态、还能派发消息。这是官网给出的能力描述,没有独立验证。官网还主张这套强类型、单向数据流的写法更适合 LLM 生成代码,复杂度增长更线性,bug 更少——同样是官方说法,没有第三方测试或案例佐证,先当未验证的主张看。

跟主流框架摆在一起看,差异更清楚:

维度React / Vue / Svelte / SolidFoldkit
架构自由度团队自定,组件树+Hooks 任意生长强制单一 Model,不留组件、Hooks、本地状态的口子
状态管理分散在组件里,按需引入 Redux、Zustand 等集中一个 Model,Message 驱动 update
副作用处理useEffect 等隐式调用,靠团队自觉规范Command 显式声明,运行时统一调度
生态成熟度组件库、模板、招聘市场都成熟Beta 阶段,第三方生态基本空白
SSR官方支持或有成熟方案暂无,需自己做静态生成

代价写在官网自己脸上

Foldkit 专门开了一节坦白代价:没有组件,没有 Hooks,没有本地状态,一切都要用 Message 和 Model 显式表达。这是纪律,不是选项。它全程绑死 Effect 的 pipe、可辨识联合这套写法,没有逃生舱——用了就是全用,不用就整个不用。

谁来定义架构? React / Vue / Svelte / Solid 组件 + Hooks 本地状态自由生长 架构由团队自定 生态成熟,库多 Foldkit 单一 Model Message 驱动 update Effect 声明式副作用 架构强制统一,无口子 左边给引擎,右边给规矩

官网给的画像很清楚:面向已经用 Effect 写后端、想要前后端同一套语言和模式的团队,以及状态复杂到需要显式建模的项目,比如鉴权流程、实时数据、多步表单。

已经在用 Effect 写后端的团队,试点成本最低,语言和心智模型都是现成的,值得小范围拉一个模块试水。深陷 React、Next.js 生态、靠成熟组件库过日子的团队,现在迁移基本等于重写——官网给的折中方案是用 Runtime.embed 把 Foldkit 组件当孤岛嵌进现有应用,先圈一小块试。

它现在也没有现成 SSR,只能自己做静态生成,官网自己的站点就是这么搭的。Beta 阶段、仅面向客户端 SPA、不能渐进迁移进已有大型 React 项目,这三条限制决定了它眼下还进不了大多数团队的候选名单。

强约束能不能收敛复杂度

单向数据流不是新想法。Elm 语言十几年前就靠“没有运行时报错”这句口号火过一阵,单一 Model、消息驱动、状态可追踪,业内早有共识这是对的架构。它到今天依然是小众语言,不是架构错了,是它没给团队留退路——生态一旦有空白,只能自己从头造。

Foldkit 把这套哲学搬进 TypeScript,再接上 Effect 生态,起点比当年的 Elm 更窄,也更实:它瞄准的是已经在用 Effect 的团队,不是从零推广一门新语言。但“强约束能不能出圈”,跟当年是同一个问题,只是换了一批答题人。

前端这些年吃的亏,恰恰是规矩立得太松:组件想怎么长状态就怎么长,useEffect 里塞多少隐藏副作用全凭自觉。Foldkit 把这条路堵死,单一 Model 加消息驱动确实提升了可追踪性,少了隐式 mutation 和过期闭包这类经典 bug 来源。

少一分自由,才换来这份可预测。

代价也同样真实。集中状态意味着大应用里 Model 会长成一棵大树,样板代码不会消失,只是从组件里搬到了 Message 和 Command 的声明里。团队的认知成本,从“记住这个组件怎么用”变成“记住整套 Elm 架构怎么想”。

接下来最该盯的变量,是 Foldkit 出 1.0 时敢不敢补上 SSR,以及它能不能拉到第一批不写 Effect 后端、纯粹为了架构纪律而迁移过来的团队。如果连这批“自来水”用户都招不到,它大概率会困在 Effect 生态自己的一亩三分地里。