用于小部件的与宿主无关的工具包:定义小部件是什么的契约类型,
以及用于发现小部件类型并解析其渲染模块的运行时。
安装
安装模块:
npm install @wordpress/widget-primitives --save
此软件包假定你的代码将运行在 ES2015+ 环境中。
如果你使用的环境对此类语言特性和 API 的支持有限或完全不支持,应在代码中包含 随@wordpress/babel-preset-default 提供的 polyfill。
设置
此软件包不附带样式表;没有需要入队或导入的内容。
契约类型、<WidgetRender> 和 useWidgetTypes() 可在任何 React 应用中使用。宿主可以按任意方式获取小部件模块记录并将其传入;useWidgetTypes( records ) 会导入每条记录的元数据模块,并返回解析后的 WidgetType[]。
在 WordPress 站点上,这些记录来自 /wp/v2/widget-modules REST 端点,该端点在启用 gutenberg-dashboard-widgets 实验时公开。仪表盘通过 @wordpress/core-data 实体读取该端点,并将记录传递给该 Hook。
空的记录列表会解析为一个空的 widgetTypes,且 isResolvingWidgetTypes 被设为 false。传入 null(或 undefined)会使该 Hook 保持加载状态:widgetTypes 为空,且 isResolvingWidgetTypes 保持为 true。
公共 API
<WidgetRender>
它是任何挂载小部件的宿主的入口点。它通过宿主提供的 resolveWidgetModule 解析渲染模块,并使用 attributes / setAttributes 契约挂载组件。
错误处理和界面外壳由宿主负责,宿主会将惰性渲染包裹在 Suspense 边界中。
useWidgetTypes( records )
它接收宿主提供的记录(WidgetModuleRecord[],或加载时的 null),并导入每条记录的元数据模块。它返回 [ widgetTypes, isResolvingWidgetTypes ];该标志在它们完成解析前会一直保持为 true。
useWidgetActions( actions )
它声明已挂载小部件希望宿主放置的操作。该列表就是该次调用的完整集合:不适用的操作会被省略。一个小部件的多个组件可以分别调用它;WidgetRender 会在宿主看到这些列表之前将它们合并。
携带已声明操作 id 的运行时操作会取代该已声明操作,并保留它所省略的已声明 icon 和 relevance。
该列表按值比较,因此可以内联编写,并且回调始终运行其最新版本。当宿主不具备 actions 能力时,该 Hook 返回 false,小部件会继续渲染自己的操作入口。
HostLink
这是使用者挂载链接目标的方式,也是大多数使用者会接触到的唯一接缝部分:当 match 识别该目标时使用宿主的 Link,否则使用普通锚点。打开新文档的目标永远不会被路由,它会从锚点属性中识别这一点:非 false 的 download,或 UI 链接将 openInNewTab 解析成的 _blank target。
它接收 href 和锚点属性,并通过 UI 链接的 render 属性进行组合,该 UI 链接会合并自身的锚点属性。
WidgetHostProvider / useWidgetHost
它本身就是接缝:嵌入应用将只有它自己知道的信息作为可选能力的 WidgetHost 集合提供。该 Provider 会将其值合并到继承的值之上;缺失的能力会降级为宿主无关行为。
第一个能力是 links(WidgetHostLinks):match 将 href 解析为应用内路由(一个字符串,即路由器所接收的路径和查询;对于应用不拥有的任何内容,则为 null),而 Link 是路由器的原语,必须渲染一个真实的锚点并将 ref 转发给该锚点。
应用挂载该 Provider。useWidgetHost 直接读取该集合,以便访问某个组件尚未覆盖的能力,或使用者在渲染前需要的答案。
HostLink 通过该 ref 访问锚点:丢弃该 ref 的链接会被键盘导航跳过,并失去其工具提示。Widget Host Storybook 页面包含用于固定这一行为的测试。
第二个能力是 actions(WidgetHostActions):declare 接收一个实例的运行时操作。放置操作的宿主会在挂载小部件渲染结果的位置绑定它。
契约类型
WidgetType、WidgetName、WidgetIcon、WidgetRenderProps、ResolveWidgetModule、WidgetModuleRecord 和 WidgetAttributeRecord。WidgetIcon 是已渲染的 SVG 元素,宿主会将其原样传递给自己的图标原语;在 widget.json 中,小部件改为声明一个已注册的图标名称,并在到达宿主之前解析该名称。WidgetAttributeRecord 是 widget.json 所声明的属性:DataViews Field 中可用 JSON 表达的子集。
WidgetAttributeField< Item >
它是 widget.ts 条目的编写辅助工具:一个 DataViews Field,其 id 被收窄到该小部件的属性键。
它的可选 relevance 提示('high' | 'medium' | 'low')标记宿主可能提升到显眼位置的属性。useWidgetTypes 会按 id 将这样的条目合并到 widget.json 声明的条目之上,因此模块只携带 JSON 无法表达的内容;isValid 会逐条规则合并,因此模块中的 custom 验证器会在合并 JSON 规则后继续保留。
WidgetAction
它是小部件类型公开的一个声明式动词:一个信封(id、label、可选的 icon 和 relevance),外加恰好一种履行方式,由携带它的键命名。
目前唯一的键是 href,即链接目标,带有可选的 download / openInNewTab。data: 和 javascript: href 会在注册时被拒绝。请优先使用小部件旁边的文件、绝对 URL,或为生成内容使用 downloadBlob。
小部件命名意图及其履行方式;宿主挂载原语并拥有放置方式。
WidgetCallbackAction 是仅运行时的形式:相同的信封,以 callback 函数作为履行方式。WidgetRuntimeAction 可以是其中任一形式,而 WidgetActionEnvelope 是两者共享的身份。
字段类型
registerFieldType( definition ) 命名一个可复用的字段类型——{ name: 'location', baseType: 'text', Edit, ... },其类型由 FieldTypeDefinition 定义。这些属性通过 type 进行引用。
useWidgetTypes 会将这些引用解析为 DataViews 能理解的普通逐字段 Field 属性,其余部分继承自 baseType。
图标
registerIconResolver( resolver ) 注册已注册图标名称(widget.json 中的 "icon": "core/calendar")如何变为可渲染元素。应用只需注册一次;useWidgetTypes 会在组装每个 WidgetType 时解析引用,因此宿主只会收到可渲染的图标。无法解析的引用会降级为无图标。
架构
有关完整流水线(编写、构建、服务器注册表和宿主)如何组合在一起,请参阅
仪表盘小部件系统架构文档。
为此软件包做贡献
这是一个独立软件包,属于 Gutenberg 项目的一部分。该项目以 monorepo 形式组织,由多个自包含的软件包组成,每个软件包都有特定用途。此 monorepo 中的软件包发布到 npm,并被 WordPress 以及其他软件项目使用。
要了解有关为此软件包或整个 Gutenberg 项目做贡献的更多信息,请阅读项目的主要 贡献者指南。