生成式 UI 框架。
根据提示词(prompt)生成动态、个性化的用户界面,同时不牺牲可靠性。借助预定义的组件与动作,确保输出既安全又可预期。
# 用于 React
npm install @json-render/core @json-render/react
# 用于 React,并附带预构建的 shadcn/ui 组件
npm install @json-render/shadcn
# 或用于 React Native
npm install @json-render/core @json-render/react-native
# 或用于视频
npm install @json-render/core @json-render/remotion
# 或用于 PDF 文档
npm install @json-render/core @json-render/react-pdf
# 或用于 HTML 邮件
npm install @json-render/core @json-render/react-email @react-email/components @react-email/render
# 或用于 Vue
npm install @json-render/core @json-render/vue
# 或用于 Svelte
npm install @json-render/core @json-render/svelte
# 或用于 SolidJS
npm install @json-render/core @json-render/solid
# 或用于终端 UI
npm install @json-render/core @json-render/ink ink react
# 或用于完整的 Next.js 应用(路由、布局、SSR、元数据)
npm install @json-render/core @json-render/react @json-render/next
# 或用于 3D 场景(并通过 GaussianSplat 组件支持高斯泼溅)
npm install @json-render/core @json-render/react-three-fiber @react-three/fiber @react-three/drei three
为什么选择 json-render?
json-render 是一个生成式 UI框架:AI 根据自然语言提示词生成界面,但被约束在你所定义的组件范围内。你设置好护栏,AI 在其中进行生成:
- 受护栏保护 —— AI 只能使用你目录(catalog)中提供的组件
- 可预期 —— JSON 输出始终匹配你的 schema
- 快速 —— 模型生成响应时即可边流式传输边渐进渲染
- 跨平台 —— 同一份目录可同时用于 React、Vue、Svelte、Solid(Web)以及 React Native(移动端)
- 开箱即用 —— 内置 36 个预构建的 shadcn/ui 组件,可直接使用
快速入门
1. 定义你的组件目录(Catalog)
import { defineCatalog } from "@json-render/core";
import { schema } from "@json-render/react/schema";
import { z } from "zod";
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. 定义你的组件实现
import { defineRegistry, Renderer } from "@json-render/react";
const { registry } = defineRegistry(catalog, {
components: {
Card: ({ props, children }) => (
<div className="card">
<h3>{props.title}</h3>
{children}
</div>
),
Metric: ({ props }) => (
<div className="metric">
<span>{props.label}</span>
<span>{format(props.value, props.format)}</span>
</div>
),
Button: ({ props, emit }) => (
<button onClick={() => emit("press")}>{props.label}</button>
),
},
});
3. 渲染 AI 生成的规格(Spec)
function Dashboard({ spec }) {
return <Renderer spec={spec} registry={registry} />;
}
就这样。 AI 生成 JSON,你只需安全地将其渲染出来。
包(Packages)
| 包 | 说明 |
|---|---|
@json-render/core |
Schema、目录、AI 提示词、动态属性(dynamic props)、SpecStream 工具方法 |
@json-render/react |
React 渲染器、上下文、hooks |
@json-render/vue |
Vue 3 渲染器、组合式函数、Provider |
@json-render/svelte |
基于 Svelte 5 runes 响应式机制的渲染器 |
@json-render/solid |
基于细粒度响应式上下文的 SolidJS 渲染器 |
@json-render/shadcn |
36 个预构建的 shadcn/ui 组件(Radix UI + Tailwind CSS) |
@json-render/shadcn-svelte |
36 个预构建的 shadcn-svelte 组件(Svelte 5 + Tailwind CSS) |
@json-render/react-three-fiber |
用于 3D 场景的 React Three Fiber 渲染器(内置 20 个组件,包含 GaussianSplat) |
@json-render/react-native |
附带标准移动端组件的 React Native 渲染器 |
@json-render/next |
Next.js 渲染器 —— JSON 可生成包含路由、布局、SSR 的完整应用 |
@json-render/tanstack-start |
TanStack Start 渲染器 —— 可生成包含路由、布局、SSR 和 head 元数据的完整应用 |
@json-render/remotion |
Remotion 视频渲染器,提供时间轴 schema |
@json-render/react-pdf |
React PDF 渲染器,用于根据 spec 生成 PDF 文档 |
@json-render/react-email |
React Email 渲染器,用于根据 spec 生成 HTML/纯文本邮件 |
@json-render/ink |
Ink 终端渲染器,内置组件可用于构建交互式 TUI |
@json-render/image |
基于 Satori 的图像渲染器,可输出 SVG/PNG(OG 图片、社交卡片等) |
@json-render/directives |
预构建的自定义指令 —— $format、$math、$concat、$count、$truncate、$pluralize、$join、$t(i18n) |
@json-render/codegen |
用于从 json-render UI 树生成代码的工具 |
@json-render/devtools |
与框架无关的 DevTools 核心 —— 面板 UI、事件存储、选择器、stream taps |
@json-render/devtools-react |
@json-render/devtools 的 React 适配器(可即插即用使用 ``) |
@json-render/devtools-vue |
@json-render/devtools 的 Vue 适配器 |
@json-render/devtools-svelte |
@json-render/devtools 的 Svelte 适配器 |
@json-render/devtools-solid |
@json-render/devtools 的 SolidJS 适配器 |
@json-render/redux |
针对 StateStore 的 Redux / Redux Toolkit 适配器 |
@json-render/zustand |
针对 StateStore 的 Zustand 适配器 |
@json-render/jotai |
针对 StateStore 的 Jotai 适配器 |
@json-render/xstate |
针对 StateStore 的 XState Store(atom)适配器 |
@json-render/mcp |
用于 Claude、ChatGPT、Cursor、VS Code 的 MCP Apps 集成 |
@json-render/yaml |
YAML 传输格式,附带流式解析器、编辑模式与 AI SDK 转换器 |
渲染器(Renderers)
React(UI)
import { defineRegistry, Renderer } from "@json-render/react";
import { schema } from "@json-render/react/schema";
// 扁平化 spec 格式(root 键 + elements 映射)
const spec = {
root: "card-1",
elements: {
"card-1": {
type: "Card",
props: { title: "Hello" },
children: ["button-1"],
},
"button-1": {
type: "Button",
props: { label: "Click me" },
children: [],
},
},
};
// defineRegistry 用于创建类型安全的组件注册表
const { registry } = defineRegistry(catalog, { components });
<Renderer spec={spec} registry={registry} />;
Vue(UI)
import { h } from "vue";
import { defineRegistry, Renderer } from "@json-render/vue";
import { schema } from "@json-render/vue/schema";
const { registry } = defineRegistry(catalog, {
components: {
Card: ({ props, children }) =>
h("div", { class: "card" }, [h("h3", null, props.title), children]),
Button: ({ props, emit }) =>
h("button", { onClick: () => emit("press") }, props.label),
},
});
// 在你的 Vue 组件模板中:
// <Renderer :spec="spec" :registry="registry" />
Svelte(UI)
import { defineRegistry, Renderer } from "@json-render/svelte";
import { schema } from "@json-render/svelte/schema";
const { registry } = defineRegistry(catalog, {
components: {
Card: ({ props, children }) => /* Svelte 5 snippet */,
Button: ({ props, emit }) => /* Svelte 5 snippet */,
},
});
// 在你的 Svelte 组件中:
// <Renderer spec={spec} registry={registry} />
Solid(UI)
import { defineRegistry, Renderer } from "@json-render/solid";
import { schema } from "@json-render/solid/schema";
const { registry } = defineRegistry(catalog, {
components: {
Card: (renderProps) => <div>{renderProps.children}</div>,
Button: (renderProps) => (
<button onClick={() => renderProps.emit("press")}>
{renderProps.element.props.label as string}
</button>
),
},
});
<Renderer spec={spec} registry={registry} />;
shadcn/ui(Web)
import { defineCatalog } from "@json-render/core";
import { schema } from "@json-render/react/schema";
import { defineRegistry, Renderer } from "@json-render/react";
import { shadcnComponentDefinitions } from "@json-render/shadcn/catalog";
import { shadcnComponents } from "@json-render/shadcn";
// 从 36 个标准定义中挑选组件
const catalog = defineCatalog(schema, {
components: {
Card: shadcnComponentDefinitions.Card,
Stack: shadcnComponentDefinitions.Stack,
Heading: shadcnComponentDefinitions.Heading,
Button: shadcnComponentDefinitions.Button,
},
actions: {},
});
// 使用对应的实现
const { registry } = defineRegistry(catalog, {
components: {
Card: shadcnComponents.Card,
Stack: shadcnComponents.Stack,
Heading: shadcnComponents.Heading,
Button: shadcnComponents.Button,
},
});
<Renderer spec={spec} registry={registry} />;