图像与设计
在使用 @json-render/directives…
适用于为 @json-render 的 prompt、spec 和渲染器接入 $format、$math、$concat、$count、$truncate、$pluralize、$join、$t 等指令,或通过 defineDirective 定义自定义指令。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
在使用 @json-render/dir特定
解决思路
- 引入 `@json-render/directives`,使用 `standardDirectives` 作为预置指令集合。
- 在 prompt 生成中接入:`const prompt = catalog.prompt({ directives: standardDirectives });`。
- 在 React 渲染器中接入:引入 `JSONUIProvider, Renderer`,并传 `directives={standardDirectives}`:`<JSONUIProvider registry={registry} directives={standardDirectives}><Renderer spec={spec} registry={registry} /></JSONUIProvider>`。
- 需要 `createI18nDirective` 等工厂指令时,展开数组:`const directives = [...standardDirectives, createI18nDirective(config)];`。
- 自定义指令使用 `@json-render/core` 的 `defineDirective`。
- 定义 `$double` 示例:`defineDirective({ name: '$double', description: 'Double a numeric value.', schema: z.object({ $double: z.unknown() }), resolve(value, ctx) { const resolved = resolvePropValue(value.$double, ctx); return (resolved as number) * 2; } })`。
- 自定义指令名必须以 `$` 开头。
- 自定义指令名不得与内置键冲突:`$state`、`$cond`、`$computed`、`$template`、`$item`、`$index`、`$bindState`、`$bindItem`。
- Resolver 中应对子值调用 `resolvePropValue`,以支持组合。
- 用 `$format` 做本地化值格式化,基于 `Intl`,支持 `date`、`currency`、`number`、`percent`。
- `$format` 示例:`{ "$format": "currency", "value": { "$state": "/cart/total" }, "currency": "USD" }`、`{ "$format": "date", "value": { "$state": "/user/createdAt" } }`、`{ "$format": "number", "value": 1234567, "notation": "compact" }`、`{ "$format": "percent", "value": 0.75 }`、`{ "$format": "date", "value": { "$state": "/post/createdAt" }, "style": "relative" }`。
- `$format` 字段:`$format` 为 `date | currency | number | percent`,`value` 可为任意表达式,`locale?` 字符串,`currency?` 字符串默认 `"USD"`,`notation?` 字符串,`style?` 为 `"relative"` 时表示相对日期,`options?` 为额外 `Intl` 选项。
- 用 `$math` 做算术运算,示例:`{ "$math": "add", "a": { "$state": "/subtotal" }, "b": { "$state": "/tax" } }`、`{ "$math": "round", "a": 3.7 }`。
- `$math` 操作:`add`、`subtract`、`multiply`、`divide`、`mod`、`min`、`max`、`round`、`floor`、`ceil`、`abs`。
- `$math` 一元操作 `round`、`floor`、`ceil`、`abs` 只使用 `a`;除以零返回 `0`。
- `$math` 字段:`$math` 为操作枚举,`a?` 第一操作数默认 `0`,`b?` 第二操作数默认 `0`。
- 用 `$concat` 拼接字符串,示例:`{ "$concat": [{ "$state": "/user/firstName" }, " ", { "$state": "/user/lastName" }] }`。
- `$concat` 字段:`$concat` 为要解析并连接成字符串的值数组。
- 用 `$count` 获取数组/字符串长度,示例:`{ "$count": { "$state": "/cart/items" } }`。
- `$count` 对数组或字符串返回 `.length`,对其他类型返回 `0`。
- `$count` 字段:`$count` 为要计数的值。
- 用 `$truncate` 截断文本,示例:`{ "$truncate": { "$state": "/post/body" }, "length": 140, "suffix": "..." }`。
- `$truncate` 字段:`$truncate` 为要截断的值,`length?` 最大字符数默认 `100`,`suffix?` 字符串默认 `"..."`。
- 用 `$pluralize` 处理单复数,示例:`{ "$pluralize": { "$state": "/cart/itemCount" }, "one": "item", "other": "items", "zero": "no items" }`。
- `$pluralize` 输出:`"3 items"`、`"1 item"`、`"no items"`。
- `$pluralize` 字段:`$pluralize` 为计数值,`one` 单数标签,`other` 复数标签,`zero?` 零值标签。
- 用 `$join` 连接数组元素,示例:`{ "$join": { "$state": "/tags" }, "separator": ", " }`。
- `$join` 字段:`$join` 为要连接的数组,`separator?` 字符串默认 `", "`。
- 用 `createI18nDirective` 创建 i18n 指令,配置示例:`createI18nDirective({ locale: 'en', messages: { en: { 'greeting': 'Hello, {{name}}!', 'checkout.submit': 'Place Order' }, es: { 'greeting': 'Hola, {{name}}!', 'checkout.submit': 'Realizar Pedido' } }, fallbackLocale: 'en' })`。
- 在 spec 中使用 `$t`:`{ "$t": "checkout.submit" }`、`{ "$t": "greeting", "params": { "name": { "$state": "/user/name" } } }`。
- `$t` 字段:`$t` 为翻译 key,`params?` 为插值参数,值可接受表达式。
- `createI18nDirective` 配置:`locale` 当前 locale,`messages` 为 `Record<locale, Record<key, string>>`,`fallbackLocale?` 在 key 缺失时回退。
- 利用组合:每个 resolver 对输入调用 `resolvePropValue`,因此指令可包裹其他指令或内置表达式。
- 组合示例:`{ "$format": "currency", "value": { "$math": "multiply", "a": { "$state": "/price" }, "b": { "$state": "/qty" } }, "currency": "USD" }`,它会由内向外解析:`$state` 读状态,`$math` 相乘,`$format` 格式化为货币。
- 接入所有四种渲染器(React、Vue、Svelte、Solid):在 provider 和 `createRenderer` 输出上都接受 `directives`。
- Provider 模式:`<JSONUIProvider registry={registry} directives={directives}><Renderer spec={spec} registry={registry} /></JSONUIProvider>`。
- `createRenderer` 模式:`const MyRenderer = createRenderer(catalog, components); <MyRenderer spec={spec} directives={directives} />`。
- prompt 生成时传入同一数组:`const prompt = catalog.prompt({ directives });`。
- 需要单独导入时,按 Key Exports 使用:`formatDirective`、`mathDirective`、`concatDirective`、`countDirective`、`truncateDirective`、`pluralizeDirective`、`joinDirective`、`createI18nDirective`、`standardDirectives`、`I18nConfig`。
适用边界 · 注意事项
- 不使用 `@json-render/core` / `@json-render/directives` 的渲染体系时,不适用。
- 只需要静态文本或普通 UI,不需要 JSON 表达式/规格动态解析时,不必引入这些指令。
- 目标环境不支持该库,或没有 React/Vue/Svelte/Solid 渲染器集成时,不要用此技能。