wp-interactivity-api

wp-interactivity-api

热门

在构建或调试 WordPress Interactivity API 功能(包括 data-wp-* 指令、@wordpress/interactivity store/state/actions、区块 viewScriptModule 集成以及 wp_interactivity_*() 函数)时使用,涵盖性能优化、水合 (hydration) 和指令行为调试。

1948Star
287Fork
更新于 2026/7/27
SKILL.md
只读
名称
wp-interactivity-api
描述

在构建或调试 WordPress Interactivity API 功能(包括 data-wp-* 指令、@wordpress/interactivity store/state/actions、区块 viewScriptModule 集成以及 wp_interactivity_*() 函数)时使用,涵盖性能优化、水合 (hydration) 和指令行为调试。

WP Interactivity API

使用场景

当用户提到以下内容时使用此 Skill:

  • Interactivity API、@wordpress/interactivity
  • data-wp-interactivedata-wp-on--*data-wp-bind--*data-wp-context
  • 区块 viewScriptModule / 基于模块的视图脚本
  • 水合 (hydration) 问题或“指令未生效/未触发”

所需输入

  • 项目根目录 + 判别排查输出(wp-project-triage)。
  • 受影响的区块/主题/插件位置(前端、编辑器或两者兼有)。
  • 任何约束条件:WP 版本、构建流程中是否支持模块。

操作步骤

1) 检测现有用法与集成方式

搜索以下关键字:

  • data-wp-interactive
  • @wordpress/interactivity
  • viewScriptModule

判断并明确:

  • 这是通过 block.json 中的 view script module 提供交互功能的区块吗?
  • 这是主题层面的交互吗?
  • 这是插件侧“增强现有标记 (markup)”的用法吗?

如果是在创建全新的交互式区块(而不仅仅是调试),优先使用官方脚手架模板:

  • @wordpress/create-block-interactive-template(通过 @wordpress/create-block 运行)

2) 确定 Store

定位 Store 定义并确认:

  • state 的数据结构 (state shape)
  • actions(状态变更/mutations)
  • data-wp-on--* 所调用的 callbacks / 事件处理函数

3) 服务端渲染(最佳实践)

在输出 HTML 前先在服务端完成预渲染,以确保:

  • JavaScript 加载前 HTML 即具备正确的初始状态(避免页面布局偏移)。
  • 提升 SEO 表现及感知加载速度。
  • 客户端 JavaScript 接管时能够无缝水合 (hydration)。
开启服务端指令处理

对于使用 block.json 的组件,添加 supports.interactivity

{
  "supports": {
    "interactivity": true
  }
}

对于未使用 block.json 的主题/插件,使用 wp_interactivity_process_directives() 来处理指令。

在 PHP 中初始化 state/context

使用 wp_interactivity_state() 定义全局初始状态:

wp_interactivity_state( 'myPlugin', array(
  'items'    => array( 'Apple', 'Banana', 'Cherry' ),
  'hasItems' => true,
));

对于局部 context,使用 wp_interactivity_data_wp_context()

<?php
$context = array( 'isOpen' => false );
?>
<div <?php echo wp_interactivity_data_wp_context( $context ); ?>>
  ...
</div>
在 PHP 中定义派生状态 (Derived State)

当派生状态影响初始 HTML 渲染时,需在 PHP 中复刻该逻辑:

wp_interactivity_state( 'myPlugin', array(
  'items'    => array( 'Apple', 'Banana' ),
  'hasItems' => function() {
    $state = wp_interactivity_state();
    return count( $state['items'] ) > 0;
  }
));

这可以确保像 data-wp-bind--hidden="!state.hasItems" 这样的指令在首次加载时能正确渲染。

详见 references/server-side-rendering.md 获取详细示例与模式。

4) 安全地实现或修改指令

修改 markup 指令时:

  • 保持指令使用尽量轻量且作用域受控
  • 优先使用能清晰映射到 store state 的稳定数据属性
  • 确保服务端渲染的 markup 与客户端水合保持一致

WordPress 6.9 变更说明:

  • data-wp-ignore 已弃用,并将在未来版本中移除。它会破坏 context 的继承机制并引发客户端导航问题,请避免使用。
  • 指令 ID 唯一化:现在可以使用 --- 分隔符在单个元素上使用多个同类型指令(例如 data-wp-on--click---plugin-a="..."data-wp-on--click---plugin-b="...")。
  • 全新 TypeScript 类型AsyncAction<ReturnType>TypeYield<T> 可用于协助异步 action 的类型定义。

指令快速速查请参考 references/directives-quickref.md

5) 构建/工具链对齐

确认代码库支持所需的 module 构建路径:

  • 如果使用了 @wordpress/scripts,优先遵循其规范。
  • 如果使用了自定义打包工具,请确认支持 module 格式输出。

6) 排查常见故障模式

如果交互时“毫无反应”:

  • 确认 viewScriptModule 已正确入队 (enqueued) 并加载;
  • 确认 DOM 元素包含 data-wp-interactive
  • 确认 Store 的命名空间与指令的值相匹配;
  • 确认水合发生前没有出现 JS 报错。

详见 references/debugging.md

验证

  • 修改后(如适用),wp-project-triage 应显示 signals.usesInteractivityApi: true
  • 手动冒烟测试:指令按预期触发且状态正常更新。
  • 如果存在测试:针对交互路径新增或扩充 Playwright E2E 测试。

常见故障模式 / 调试指南

  • 指令存在但未生效:
    • view script 未加载、模块入口点配置错误或缺少 data-wp-interactive
  • 水合不匹配 / 页面闪烁 (Hydration mismatch / flicker):
    • 服务端 markup 与客户端预期不一致;请简化或对齐初始状态。
    • 未在 PHP 中定义派生状态:请使用带有闭包 (closure) 的 wp_interactivity_state()
  • 初始内容缺失或错误:
    • (对于区块)未在 block.json 中设置 supports.interactivity
    • (对于主题/插件)未调用 wp_interactivity_process_directives()
    • 渲染前未在 PHP 中初始化 state/context。
  • 加载时发生布局偏移 (Layout shift):
    • 服务端缺少像 state.hasItems 这样的派生状态,导致缺少 hidden 属性。
  • 性能下降:
    • 交互根节点 (interactive root) 作用域过大;应将交互范围缩小至更小的子树。
  • 客户端导航问题(WordPress 6.9):
    • getServerState()getServerContext() 现在会在页面切换间重置——请确保代码不会假定旧值仍然保留。
    • 路由区域 (Router regions) 现在支持 attachTo,用于动态渲染覆盖层(如模态框、弹窗)。

问题升级 / 排查求助

  • 如果代码库构建约束不明确,可询问:"请问项目是在使用 @wordpress/scripts 还是自定义打包工具 (webpack/vite)?"
  • 参考文档:
    • references/server-side-rendering.md
    • references/directives-quickref.md
    • references/debugging.md