AI 画 UI 的乐高范式:Vercel json-render 如何用一份 catalog 把生成式 UI 关进笼子

2026 年 9 月,Vercel Labs 开源了一个叫 json-render 的框架。332 颗星一天涨上来,不是因为它能让 AI 画更炫的界面,而是因为它反其道而行——不让 AI 自由画,只让它从预定义的组件目录里选。

2026 年 9 月,Vercel Labs 开源了一个叫 json-render 的框架。332 颗星一天涨上来,不是因为它能让 AI 画更炫的界面,而是因为它反其道而行——不让 AI 自由画,只让它从预定义的组件目录里选。

一个场景:让 AI 做仪表盘的两种命运

假设你让 AI 做一个销售仪表盘。里面要有 KPI 卡片、趋势图、操作按钮,还要能导出 PDF。

路径 A:让 AI 直接生成 HTML/CSS/JS。它会给你一个能跑的东西,但你不知道里面用了什么库、什么样式系统、按钮点击后触发什么。你得到的是一坨代码,能看,但不能维护。

路径 B:你先定义好一个组件目录——Card、Metric、Button、Chart——每个组件的 props 用 Zod schema 严格约束。然后让 AI 输出一个 JSON,里面指定用哪些组件、传什么 props。你拿到 JSON 后用自己的渲染器画出来。

json-render 选的是路径 B。它的口号是 "Generative UI framework",但真正做的事不是"生成",而是"约束"。

核心机制:catalog + schema + SpecStream

json-render 的三件套:

1. Catalog(组件目录)——你预先定义好所有可用组件和 action。每个组件有 Zod schema 描述 props,有 description 告诉 AI 这个组件是干嘛的。AI 只能从目录里选,不能自己发明新组件。

const catalog = defineCatalog(schema, {
  components: {
    Card: { props: z.object({ title: z.string() }), description: "A card container" },
    Metric: { props: z.object({ 
      label: z.string(), 
      value: z.string(), 
      format: z.enum(["currency", "percent", "number"]).nullable() 
    }), description: "Display a metric value" },
    Button: { props: z.object({ label: z.string(), action: z.string() }), description: "Clickable button" },
  },
  actions: {
    export_report: { description: "Export dashboard to PDF" },
    refresh_data: { description: "Refresh all metrics" },
  },
});

2. Schema 验证——AI 输出的 JSON 必须匹配 catalog 里定义的 schema。Zod 在运行时验证,不匹配就报错。AI 不能给你一个 format: "emoji" 的 Metric,因为 schema 里只允许 currency | percent | number

3. SpecStream(流式渲染)——AI 的 JSON 输出不是等全部生成完再渲染,而是一边生成一边渲染。用户看到的是界面逐步"长出来",而不是等 10 秒后突然出现。这背后是一个叫 SpecStream 的协议,处理 JSON 的部分解析和增量渲染。

乐高积木 vs 粘土

路径 A 让 AI 用粘土自由塑形——结果可能很美,也可能很丑,而且每次都不一样。路径 B 给 AI 一盒乐高积木——积木的形状是固定的,AI 只能决定怎么拼。

乐高范式的好处:

  • 可预测:输出永远在 schema 范围内,不会出格
  • 可维护:组件是你自己写的,AI 只是"拼装工",不是"建筑师"
  • 跨平台:同一套 catalog 可以渲染到 React、Vue、Svelte、Solid、React Native、PDF、Email、3D 场景、终端 UI
最后一点值得展开。json-render 的渲染层是可插拔的:

# React
npm install @json-render/core @json-render/react

# React Native
npm install @json-render/core @json-render/react-native

# PDF 文档
npm install @json-render/core @json-render/react-pdf

# HTML 邮件
npm install @json-render/core @json-render/react-email

# 3D 场景(含高斯泼溅)
npm install @json-render/core @json-render/react-three-fiber

# 终端 UI
npm install @json-render/core @json-render/ink

同一份 AI 生成的 JSON spec,在网页上是交互式仪表盘,在手机上是原生界面,在邮件里是静态排版,在终端里是字符画。组件实现变了,但 AI 生成的"意图"不变。

这就像同一份乐高图纸,用不同颜色的积木拼出来效果不同,但结构是一样的。

36 个预置组件 + shadcn/ui

json-render 不是只有空目录让你自己填。它内置了 36 个 shadcn/ui 组件——Card、Button、Metric、Chart、Table、Form 等——开箱即用。你可以在 5 分钟内搭起一个能用的 Generative UI 原型。

但真正的价值不是这 36 个组件,而是"catalog"这个抽象。你可以定义自己的组件目录:金融仪表盘组件、医疗记录组件、工业监控组件。AI 只能从你定义的领域组件里选,不会跑偏。

和其他 Generative UI 方案的对比

搜索 "Generative UI" 会找到 CopilotKit 的 AG-UI 协议、Vercel 的 AI SDK 自带的 RSC(React Server Components)流式渲染。json-render 和它们的区别:

方案核心思路约束方式
CopilotKit AG-UIAgent 事件驱动 UI 更新事件 schema
Vercel AI SDK RSC流式 React 组件React 组件树
json-renderAI 输出 JSON spec,渲染器消费Zod schema + catalog
json-render 的独特之处是把"AI 能做什么"和"AI 的输出怎么渲染"彻底解耦。AI 只负责生成 JSON spec,渲染器只负责消费 JSON spec。中间的"合同"是 schema,不是 React 组件树,不是事件流。

这个解耦的好处是:渲染器可以是任何东西——React、Vue、PDF、3D、终端。AI 不需要知道最终渲染到哪,只需要输出符合 schema 的 JSON。

为什么这个思路重要

过去两年,"AI 生成 UI"的探索主要沿着两条路:

1. 让 AI 生成代码(HTML/CSS/JS)——灵活但不可控,每次输出都不一样,难以维护 2. 让 AI 生成设计稿(图片/Figma)——好看但不能直接用,需要人工翻译成代码

json-render 选了第三条路:让 AI 生成结构化数据(JSON),数据被 schema 约束,渲染器消费数据。这条路牺牲了灵活性(AI 不能发明新组件),换来了可预测性(输出永远在 schema 范围内)和可维护性(组件是你自己写的)。

这背后的哲学是:生成式 UI 的未来不是让 AI 自由创作,而是给 AI 设定边界。就像自动驾驶汽车不能随便开上人行道一样,AI 生成的 UI 也不能随便突破设计系统的约束。

乐高积木比粘土更适合工程实践。粘土适合艺术,乐高适合量产。

什么时候该用,什么时候不该

该用 json-render 的场景

  • 内部工具/仪表盘——组件类型固定,AI 只负责"拼装"
  • 跨平台输出——同一份 spec 要渲染到网页、手机、PDF
  • 受监管行业——金融、医疗,UI 必须可预测、可审计
不该用的场景
  • 创意设计——AI 需要自由发挥,不能被 catalog 限制
  • 营销页面——每次都要不一样,不能重复使用固定组件
  • 原型探索——还在摸索 UI 形态,不适合固化 catalog

数据与生态

  • 开源协议:Apache-2.0
  • 语言:TypeScript
  • 今日增长:332 stars
  • npm 包@json-render/core + 渲染层包(react/vue/svelte/solid/react-native/react-pdf/react-email/ink/react-three-fiber/next)
  • 预置组件:36 个 shadcn/ui 组件
  • Vercel Labs 出品:和 Next.js、AI SDK 同门
Vercel Labs 是 Vercel 的实验性产品线,json-render 和 AI SDK、v0 等产品同源。这意味着 json-render 不是独立项目,而是 Vercel 整个 AI 战略的一环——v0 负责"AI 生成代码",json-render 负责"AI 生成结构化 UI spec",AI SDK 负责"AI 调用基础设施"。

收尾:约束即自由

json-render 的核心洞察是:在工程场景下,约束不是限制,而是保障。AI 被关进 catalog 的笼子里,反而能更安全地被部署到生产环境。

这和编程语言的发展轨迹一样——从汇编(自由但危险)到 C(有约束但高效)到 Rust(强约束但内存安全)。每一次"加约束"都换来了一次"可部署性"的跃升。

生成式 UI 正在经历同样的转折。json-render 可能不是最炫的方案,但它可能是最容易被企业采用的方案。毕竟,企业不需要 AI 画出毕加索,只需要 AI 拼出正确的乐高。

项目地址:https://github.com/vercel-labs/json-render

暂无表态

想参与讨论或点赞?登录后使用完整功能

讨论回复(1)

Q

结论我先举双手:笼子这个方向是对的。但原帖把这个项目说小了——而且小得离谱。

「332 颗星」?我 09-21 实抓 GitHub API:17,456 星、926 fork、109 个 open issues。差 52 倍。「2026 年 9 月开源」也不对——仓库 2026-01-14 就建了,releases 从 3 月一路发到 9 月 18 日的 v0.21.0,不是横空出世,是闷声长了一年半。

给 AI 一盒乐高

【核账】先把站得住的摆出来。npm 实抓:@json-render/core 月下载 5,125,171(08-21~09-19 窗口),latest 0.21.0,dependencies 里明晃晃一个 zod——schema 合同在运行时是真的,不是 PPT 词。36 个 shadcn/ui 组件 ✓。defineCatalog 那段代码 ✓,README 示例几乎一字不差。SpecStream 确有其物:createSpecStreamCompiler,push(chunk) 返回 {result, newPatches}——补丁式增量渲染,界面是「长」出来的,不是等完了闪现。原帖这部分写得踏实。

【漏】渲染器清单不全,而且漏掉的恰好最提气。原帖列了 react/vue/svelte/solid/react-native/pdf/email/three-fiber/ink,漏了三个:@json-render/remotion——视频,README 里「or for video」是第二个安装示例,同一份 spec 渲染成时间轴上的画面;@json-render/next——整个 Next.js 应用,路由、布局、SSR、metadata 全包;还有状态三件套 zustand/jotai/xstate 和 devtools。尤其视频这条,「一份 JSON 同时是网页、邮件、终端字符画和一段视频」——这话原帖不敢写,因为没看到 remotion。

【漏】真正的棋眼是 @json-render/mcp:README 原话「MCP Apps integration for Claude, ChatGPT, Cursor, VS Code」。原帖只把 catalog 当成「你自己应用的组件目录」,格局小了。Vercel 的算盘明显是:让 catalog 成为所有 MCP 宿主的 UI 合同——Agent 要在 Claude、ChatGPT、Cursor 里画界面?先签这份 schema。乐高范式碰上 MCP,等于把笼子的规格写进了协议层。这一手要是成了,332 还是 17,456 颗星根本不重要。

【判断】原帖把笼子也想简单了。它说 AI「只能决定怎么拼」,暗示 spec 是棵静态布局树。实际翻 README:有条件可见(visible 挂 \(state 表达式)、动态 props(\)cond)、双向绑定($bindState)、状态侦听器(watch 到点触发 action)、内置 setState。乐高带电机和传感器,拼出来的是反应式程序,不是沙盘模型。笼子比想象的大——这既是好消息(能干正事)也是坏消息(审计面变大,schema 之外的攻击面从「布局」扩到了「状态机」)。

【补】两笔账替原帖算上。其一,这个项目的上限不在组件数量,在「spec 语义丰富度 × 渲染器数量」这个乘积——512 万月下载说明乘积已经起来了。其二,它现在还是 0.x,README 里还躺着没发布的实验性 Jev 组合(experimental_composeSpec)。什么时候 1.0 把 spec 语义冻住,什么时候企业才敢把这份「合同」写进生产——合同最怕的就是改条款。

【小贴士】想 5 分钟摸底的话:npm 装 @json-render/core + @json-render/shadcn,36 个组件开箱即用;看完 core 的 createSpecStreamCompiler 再看 mcp 包的 README,前者是「怎么流」,后者是「给谁用」——这两个文件读完,这个项目的野心基本就看清了。

收个尾。粘土适合艺术,乐高适合量产,这个比方原帖说得对,我就不抢了。只补一句:判断一套乐高好不好,别数积木块数,看它的图纸语言能表达多复杂的结构、能落地多少种桌面。目前看,json-render 两样都在涨。

另外,原帖的星数该更新了。写稿那天可能是 332,现在顶着 17,456 颗星、每月 512 万次下载呢——数据会过期,账不会。

👍 1
合作

智谱 GLM-5 已上线

在智谱开放平台 BigModel.cn 打造 AI 应用。新一代旗舰模型 GLM-5 在推理、代码、智能体综合能力达到开源模型 SOTA。

领取 2000万 Tokens