mcpField
P
portable-text-serialization

portable-text-serialization

github.com/sanity-io开发1942.9k 次安装1 天前更新
代码仓库

关于 portable-text-serialization

使用 `@portabletext/*` 系列库在不同框架中渲染 Portable Text 的参考技能,说明组件映射、框架规则,以及自定义内容、缺失组件和 GROQ 查询模式。

主要功能

  1. 01各框架的 Portable Text 渲染
  2. 02块与标记的组件映射
  3. 03自定义类型渲染指南
  4. 04缺失组件的处理方式
  5. 05GROQ 引用展开指南

适用场景

  1. 01在框架中渲染 Portable Text
  2. 02映射自定义内容块和注释
  3. 03处理未知内容类型
  4. 04查询含引用的 Portable Text

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/sanity-io/agent-toolkit --skill portable-text-serialization

安装后在 Claude Code 中输入/portable-text-serialization确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

rules/
astro.md
html.md
markdown.md
plain-text.md
react.md
svelte.md
vue.md

详细介绍

可移植文本序列化

使用 @portabletext/* 库系列,在各种框架中渲染可移植文本内容。每个库都遵循相同的组件映射模式:提供一个 components 对象,将 PT 节点类型映射到对应框架的渲染器。

可移植文本结构(快速参考)

PT 是一个由多个块组成的数组。每个块都有 _type、可选的 style、children(文本片段)、markDefs、listItem 和 level。

Root array
├── block (_type: "block")
│   ├── style: "normal" | "h1" | "h2" | "blockquote" | ...
│   ├── children: [span, span, ...]
│   │   └── span: { _type: "span", text: "...", marks: ["strong", "<markDefKey>"] }
│   ├── markDefs: [{ _key, _type: "link", href: "..." }, ...]
│   ├── listItem: "bullet" | "number" (optional)
│   └── level: 1, 2, 3... (optional, for nested lists)
├── custom block (_type: "image" | "code" | any custom type)
└── ...more blocks

标记分为两种:

  • 装饰符:marks[] 中的字符串值,如 "strong"、"em"、"underline"、"code"
  • 注释:marks[] 中引用 markDefs[] 条目的键(例如,链接、内部引用)

组件映射模式(所有框架)

每个 @portabletext/* 库都接受一个包含以下键的 components 对象:

键渲染内容属性/数据
types自定义块/行内类型(图像、代码、CTA)value(块数据)
marks装饰符 + 注释children + value(标记数据)
block块样式(h1、普通、引用块)children
list列表容器(ul、ol)children
listItem列表项children
hardBreak块内换行—

框架专属规则

请阅读与你的框架相对应的规则文件:

  • React / Next.js:rules/react.md — @portabletext/react 或 next-sanity
  • Svelte / SvelteKit:rules/svelte.md — @portabletext/svelte
  • Vue / Nuxt:rules/vue.md — @portabletext/vue
  • Astro:rules/astro.md — astro-portabletext
  • HTML(服务端):rules/html.md — @portabletext/to-html
  • Markdown:rules/markdown.md — @portabletext/markdown
  • 纯文本提取:rules/plain-text.md — @portabletext/toolkit
其他社区序列化器

这些序列化器列于 portabletext.org,但没有专属规则文件:

目标包
React Native@portabletext/react-native-portabletext
React PDF@portabletext/react-pdf-portabletext
Solidsolid-portabletext
Qwikportabletext-qwik
Shopify Liquidportable-text-to-liquid
PHPsanity-php(SanityBlockContent 类)
Pythonportabletext-html
C# / .NETdotnet-portable-text
Dart / Flutterflutter_sanity_portable_text

常见模式(所有框架)

自定义类型需要显式组件

PT 渲染器默认只处理标准块。自定义类型(image、code、callToAction 等)需要显式配置组件映射,否则不会渲染。

保持组件对象稳定

在 React/Vue 中,将 components 定义在渲染函数之外,或对其进行记忆化。每次渲染都重新创建会导致不必要的重复渲染。

妥善处理缺失的组件

所有库都接受 onMissingComponent,用于控制遇到未知类型时的行为:

  • false — 抑制警告
  • 自定义函数 — 记录日志或报告问题
使用 GROQ 查询 PT

始终展开自定义块中的引用:

body[]{
  ...,
  _type == "image" => {
    ...,
    asset->
  },
  markDefs[]{
    ...,
    _type == "internalLink" => {
      ...,
      "slug": @.reference->slug.current
    }
  }
}

评论

支持 Markdown