用途
XState 用于把前端流程逻辑(向导、结算、认证、上传,以及任何带有模式、时序、取消、超时、重试的交互)建模为状态机和状态图。其目标是让流程逻辑成为一份显式、可验证的模型,而非散落在各处的事件处理器。
主要能力
- 无头可测试性:机器以事件为输入、以快照为输出,可在 UI 存在之前用快速单元测试验证流程逻辑,
xstate/graph能生成覆盖各转换的路径。 - 不可表示不可能状态:有限状态加受守卫的转换,可消除布尔标志类 bug(如
isLoading && isError)。 - 单一可复核产物:每个状态 × 事件的组合都在一份声明式结构中,便于整体审查行为面。
- 免费获得图表:Stately Studio 和 inspector 渲染的正是发布的机器。
此外还涵盖 actor 逻辑类型、invoke 与 spawn 的选择、spawn 卫生、通信、systemId receptionist、持久化、检查、React 集成、测试分层、provide() 作为测试缝、SimulatedClock、纯 transition、模型化测试、持久化往返与变异分数指导,以及 TypeScript setup() 类型模型、assertEvent、类型助手、无 typestates 注意事项和 v4→v5 迁移表。
使用方式
默认立场:将前端流程逻辑建模为状态图;对于无模式的数据形状状态,使用 @xstate/store 或普通可辨识联合,而不要构建形式化的机器。技能指出真正的风险是欠建模而非过建模,因为训练数据大多是一般 React 代码。
版本护栏:仅限 XState v5(setup()、createActor、actors)。若见到 Machine()、interpret()、cond:、services: 或 typegen,则属于 v4,需先按迁移表翻译。
写状态之前:先确认仓库中机器的归属(架构或边界测试、导入边界规则、ADR、已有机器目录、CLAUDE.md 等),仓库约定优先于本技能的默认同置建议。
两条生命周期测试(按什么改变值分类,而非按渲染结果):
- 是否由外部答案改变?(网络响应、计时器、其他 actor、平台)
- 交互是否存在可被中断的中间阶段?(拖拽、关闭动画、手势监听器)
两项测试均为空时,状态才留在 React 中。
既有 actor 归属:若某 actor 已拥有该生命周期,状态应放入该 actor,复杂度阶梯不再重新决策。新机器的边界是“具有自身输入输出的独立功能单元”。
防错规则:事件优先再定模式;有限状态=模式、context=数据;context 是 JSON 数据;效果用 actor 而非 action;在 setup() 中命名一切;v5 转换默认内部;机器像函数一样完成;每个流程一台机器、每个生命周期一个所有者;无头测机器、通过 DOM 测组件;在信任边界校验事件。
图表渲染:机器设计或变更时即渲染或更新图表,渲染结果是仓库中的文件(markdown 文件中的 mermaid 块或机器文件顶部注释),而非回复中的消息。使用 Mermaid stateDiagram-v2,每个有限状态一个节点,每条边标注事件与守卫,展示 onDone/onError。
适用场景
构建或审查向导、结算/认证/上传流程、带重试或超时的异步编排、画布与编辑器交互、任何发送至 BFF 或服务端的内容、布尔标志状态 bug,或任何 XState 与状态机代码。也会在普通 React 代码已构成手写状态图时触发。
限制
仅支持 XState v5。若仓库的层级规则禁止机器出现在某层,正确的机器仍会导致构建失败,因此须先确定允许的位置。context 不得包含类实例、promise 或 DOM 节点(已生成的 actor 引用是例外)。关于收费、价格、平台等具体信息,资料未提供,暂未提供。
配套依赖
可搭配 testing、react-testing/front-end-testing、typescript-strict、functional 使用;事件溯源的领域状态由 event-sourcing 负责 Decider。