XState
基于状态机、状态图和 Actor 模型的 JavaScript/TypeScript 状态管理与逻辑编排库,让复杂应用逻辑变得可视化、可预测、可测试。
XState 是 JavaScript 最成熟的有限状态机和状态图实现库,2023 年 v5 全面拥抱 Actor 模型。将复杂应用逻辑建模为可视化、可穷举的状态转换,天然解决回调地狱、竞态条件和不可达状态等问题,适合多步流程、并发编排和复杂业务规则场景。
XState
基于状态机、状态图和 Actor 模型的 JavaScript/TypeScript 状态管理与逻辑编排库,让复杂应用逻辑变得可视化、可预测、可测试。
技术简介说明
XState 由 David Khourshid 于 2015 年创建,是 JavaScript 生态中最成熟的**有限状态机(FSM)和状态图(Statecharts)**实现库。它基于计算机科学中有着严格数学基础的有限状态自动机理论,将复杂的应用逻辑建模为离散的、可穷举的状态与状态之间的确定性转换。
XState 的核心理念是:用图表(charts)表达逻辑,而非用代码命令式地控制逻辑。每个状态机就是一个独立的"Actor",它们可以互相通信、派生子 Actor,形成层次化的分布式状态管理系统。这种模式天然解决了传统回调地狱、竞态条件、不可达状态等常见的状态管理难题。
2023 年 12 月,XState v5 正式发布,全面拥抱 Actor 模型,大幅简化了 API 并增强了 TypeScript 类型推导。截至 2026 年中,v5 已迭代至 5.32.x 稳定版,v6 alpha 也已进入公开测试阶段。XState 在 GitHub 上拥有约 29.7k stars,npm 周下载量约 150 万次,被全球大量生产级应用采用。
基本信息
| 项目 | 详情 |
|---|---|
| 官网 | https://xstate.js.org / https://stately.ai/docs |
| GitHub | https://github.com/statelyai/xstate |
| License | MIT |
| 当前稳定版 | v5.32.4(2026 年 7 月 3 日发布) |
| 当前 Alpha 版 | v6.0.0-alpha.16(2026 年 6 月 30 日) |
| GitHub Stars | ~29.7k(2026 年 7 月) |
| npm 周下载量 | ~150 万次 |
| 主要维护者 | David Khourshid(@DavidKPiano,创建者)、Stately AI 团队 |
| TypeScript 支持 | 原生 TypeScript,v5 起类型推导大幅增强 |
快速上手
安装
# npm
npm install xstate
# yarn
yarn add xstate
# pnpm
pnpm add xstate基础配置
在 React 项目中使用(推荐):
# 安装 React 绑定
npm install @xstate/react
# 或使用 pnpm
pnpm add @xstate/react在 Vue 项目中使用:
XState v5 是框架无关的,可以直接在 Vue 3 的 setup() 中使用。
浏览器 CDN:
<script src="https://cdn.jsdelivr.net/npm/xstate@5/dist/xstate.min.js"></script>最小示例
一个简单的光控开关状态机:
import { createMachine, createActor } from 'xstate';
// 1. 定义状态机
const toggleMachine = createMachine({
id: 'toggle',
initial: 'inactive',
states: {
inactive: {
on: { TOGGLE: 'active' }
},
active: {
on: { TOGGLE: 'inactive' }
}
}
});
// 2. 创建 Actor 实例
const toggleActor = createActor(toggleMachine);
// 3. 订阅状态变化
toggleActor.subscribe((snapshot) => {
console.log('当前状态:', snapshot.value);
});
// 4. 启动 Actor
toggleActor.start();
// 输出: "当前状态: inactive"
// 5. 发送事件触发状态转换
toggleActor.send({ type: 'TOGGLE' });
// 输出: "当前状态: active"
toggleActor.send({ type: 'TOGGLE' });
// 输出: "当前状态: inactive"一个带上下文(context)的数据获取示例:
import { createMachine, createActor, fromPromise, assign } from 'xstate';
const fetchMachine = createMachine({
id: 'fetch',
initial: 'idle',
context: {
data: null,
error: null,
retries: 0
},
states: {
idle: {
on: { FETCH: 'loading' }
},
loading: {
invoke: {
id: 'fetchData',
src: fromPromise(({ input }) => fetch(input.url).then(r => r.json())),
onDone: {
target: 'success',
actions: assign({
data: ({ event }) => event.output
})
},
onError: {
target: 'failure',
actions: assign({
error: ({ event }) => event.error,
retries: ({ context }) => context.retries + 1
})
}
}
},
success: { type: 'final' },
failure: {
on: {
RETRY: {
target: 'loading',
actions: assign({ retries: ({ context }) => context.retries + 1 })
}
}
}
}
});核心概念与架构
状态机(State Machine)
XState 的基础是有限状态机,一个状态机由以下要素组成:
- 有限状态集合:所有可能状态的有限集(如
idle、loading、success、error) - 当前状态:系统在某一时刻所处的状态
- 事件:触发状态转换的外部输入
- 转换函数:给定当前状态和事件,决定下一个状态
- 初始状态:系统的起始状态
FETCH
[idle] ──────────────────────► [loading]
│ │
DONE │ │ ERROR
▼ ▼
[success] [failure]
▲ │
│ │ RETRY
└───────┘
状态图(Statecharts)
状态图是 David Harel 于 1987 年提出的对有限状态机的扩展,解决了传统 FSM 的组合爆炸问题。XState 完整支持状态图规范,核心扩展包括:
- 复合状态(Compound States):状态可以嵌套,父状态包含子状态
- 并行状态(Parallel States):多个子状态可以同时活跃
- 历史状态(History States):记住之前离开时的子状态
- 守卫条件(Guards):条件判断,决定是否执行转换
- 副作用动作(Actions):在转换时执行的副作用
- 延迟转换(Delayed Transitions):基于时间的自动转换
- 层级上下文(Extended State / Context):存储状态之外的动态数据
Actor 模型
XState v5 的核心架构范式是 Actor 模型,每个状态机实例就是一个 Actor:
- Actor:一个独立的执行实体,拥有自己的状态和消息队列
- 消息传递:Actor 之间通过事件(消息)异步通信
- 派生子 Actor:Actor 可以动态创建子 Actor
- 生命周期:Actor 有明确的生命周期(启动、运行、停止)
// Actor 逻辑创建器
import { fromPromise, fromCallback, fromObservable, fromTransition } from 'xstate';
// Promise Actor
const fetchDataActor = fromPromise(async ({ input }) => {
const response = await fetch(input.url);
return response.json();
});
// Callback Actor(用于 WebSocket 等)
const websocketActor = fromCallback(({ receive, sendBack }) => {
const ws = new WebSocket('wss://example.com');
ws.onmessage = (event) => sendBack(event.data);
receive((event) => ws.send(event.value));
return () => ws.close();
});事件驱动架构
XState 是完全事件驱动的:
- 所有状态转换都由事件触发
- 事件是不可变的数据对象(如
{ type: 'SUBMIT', payload: {...} }) - Actor 之间只通过事件通信
- 事件可以被序列化,支持时间旅行调试
核心特性
1. 类型安全的状态机定义
XState v5 的 setup() API 提供了完整的类型安全体验:
import { setup, createActor, fromPromise } from 'xstate';
const machine = setup({
types: {} as {
context: { userId: string; data: any };
events:
| { type: 'LOGIN'; userId: string }
| { type: 'LOGOUT' }
| { type: 'DATA_LOADED'; data: any };
},
actors: {
fetchData: fromPromise(async ({ input }: { input: { userId: string } }) => {
const res = await fetch(`/api/data/${input.userId}`);
return res.json();
})
}
}).createMachine({
id: 'auth',
initial: 'idle',
context: { userId: '', data: null },
states: {
idle: { /* ... */ },
loading: { /* ... */ }
}
});2. 可视化调试(Stately Inspector)
通过 @statelyai/inspect 在浏览器中实时可视化状态转换和 Actor 通信:
import { createBrowserInspector } from '@statelyai/inspect';
const inspector = createBrowserInspector();
const actor = createActor(machine, { inspect: inspector.inspect });
actor.start();3. 无限层级嵌套与并行状态
const machine = createMachine({
id: 'app',
initial: 'dashboard',
states: {
dashboard: {
type: 'parallel', // 并行状态:多个子状态同时活跃
states: {
analytics: {
initial: 'loading',
states: {
loading: { /* ... */ },
loaded: { /* ... */ },
error: { /* ... */ }
}
},
notifications: {
initial: 'unread',
states: {
unread: { /* ... */ },
read: { /* ... */ }
}
}
}
}
}
});4. Actor 通信与编排
支持复杂的多 Actor 协作场景:
const parentMachine = createMachine({
id: 'orchestrator',
invoke: [
// 并行的子 Actor
{ id: 'auth', src: authActor },
{ id: 'dataSync', src: syncActor }
],
on: {
'auth.LOGGED_IN': {
actions: sendTo('dataSync', { type: 'START_SYNC' })
}
}
});5. 延迟转换与时间驱动
const machine = createMachine({
id: 'notification',
initial: 'visible',
states: {
visible: {
after: {
// 3 秒后自动转换到隐藏状态
3000: 'hidden'
}
},
hidden: { type: 'final' }
}
});6. 持久化与序列化
状态快照可序列化,支持持久化和恢复:
// 获取可序列化的快照
const snapshot = actor.getSnapshot();
const serialized = JSON.stringify(snapshot);
// 恢复状态
const restored = createActor(machine, {
snapshot: JSON.parse(serialized)
});
restored.start();7. 强大的事件处理能力
- 守卫条件(Guards)控制转换
- 动作(Actions)执行副作用
- 事件重映射和过滤
- 通配事件和复合事件匹配
8. 框架无关设计
XState v5 是框架无关的,官方提供 React(@xstate/react)绑定,社区提供 Vue、Svelte、Solid 等适配。@xstate/store 包还额外提供 Svelte(@xstate/store-svelte)和 Solid(@xstate/store-solid)的 Store 适配器。
9. 零依赖
XState 核心包零外部依赖,体积小(gzip 约 13 KB),适用于任何 JavaScript 运行环境(浏览器、Node.js、Deno、Bun、React Native 等)。
10. 测试友好
状态机本质上是确定性的——给定相同的输入,总是产生相同的输出。这使得单元测试非常直接:
import { createActor } from 'xstate';
import { toggleMachine } from './machines';
it('should toggle to active on TOGGLE event', () => {
const actor = createActor(toggleMachine);
actor.start();
expect(actor.getSnapshot().value).toBe('inactive');
actor.send({ type: 'TOGGLE' });
expect(actor.getSnapshot().value).toBe('active');
});生态图
核心包
| 包名 | 说明 | 最新版本 |
|---|---|---|
xstate | 核心状态机/Actor 库 | v5.32.4(稳定)/ v6.0.0-alpha.16 |
@xstate/react | React hooks 绑定(useMachine、useActor、useSelector) | v6.1.0 |
@xstate/store | 轻量级事件驱动 Store(类似 Zustand/Redux) | v3.x |
@xstate/store-svelte | Store 的 Svelte 适配器 | v2.x |
@xstate/store-solid | Store 的 Solid 适配器 | v2.0.0 |
@statelyai/inspect | 可视化调试器(替代旧的 @xstate/inspect) | 活跃维护 |
@xstate/inspect | 旧版调试器(已废弃) | 停止更新 |
工具链
| 工具 | 说明 |
|---|---|
| Stately Studio | 官方可视化状态机编辑器,支持拖拽设计和代码生成 |
| @statelyai/inspect | 浏览器实时状态/Actor 调试器 |
| Stately Sky | 云端 Actor 运行环境(实验性) |
社区生态
| 项目 | 说明 |
|---|---|
xstate-codegen | 从状态机自动生成 TypeScript 类型 |
@robingullhaug/xstate-form | 与 React Hook Form 集成 |
xstate-test | 基于状态机的测试生成工具 |
xstate-vue | 社区 Vue 3 绑定 |
| Stately 官方文档 | 替代旧的 xstate.js.org 文档 |
集成方案
- React:
@xstate/react(官方),提供useMachine、useActor、useSelector - Vue 3:通过
createActor在setup()中使用,配合shallowRef管理状态 - Svelte:
@xstate/store-svelte提供 Svelte Store 协议适配 - Solid:
@xstate/store-solid提供 Solid reactive 适配 - Next.js:与 React 集成方案一致,可在 Server Components 中使用序列化快照
- Express / Hono:用于后端工作流编排和状态管理
适用场景
1. 复杂的多步用户流程
注册向导、电商结账、保险理赔等涉及多个步骤和分支条件的流程:
// 结账流程示例
const checkoutMachine = createMachine({
id: 'checkout',
initial: 'cart',
states: {
cart: { on: { NEXT: 'address' } },
address: { on: { NEXT: 'payment', BACK: 'cart' } },
payment: {
invoke: {
src: 'processPayment',
onDone: 'review',
onError: 'paymentError'
}
},
review: { on: { CONFIRM: 'confirming', BACK: 'payment' } },
confirming: {
invoke: {
src: 'confirmOrder',
onDone: 'success',
onError: 'confirmError'
}
},
success: { type: 'final' }
}
});2. 异步数据获取与竞态条件管理
多个并发请求、取消旧请求、重试策略、加载/错误/成功状态切换:
// 搜索框:取消旧请求、防抖
const searchMachine = createMachine({
id: 'search',
initial: 'idle',
context: { query: '', results: [] },
states: {
idle: {
on: { INPUT: { target: 'debouncing', actions: assign({ query: ... }) } }
},
debouncing: {
after: { 300: 'loading' },
on: { INPUT: { target: 'debouncing', actions: assign({ query: ... }) } }
},
loading: {
invoke: {
id: 'searchAPI',
src: fromPromise(({ input }) => searchAPI(input.query)),
onDone: { target: 'results', actions: assign({ results: ... }) },
onError: 'error'
},
// 新输入时自动取消当前请求
on: { INPUT: { target: 'debouncing' } }
},
results: { on: { INPUT: 'debouncing' } },
error: { on: { RETRY: 'loading', CLEAR: 'idle' } }
}
});3. 表单验证与状态管理
多步骤表单、字段验证、条件显示/隐藏、提交状态管理。
4. 实时通信与 WebSocket 管理
连接状态(断开/连接中/已连接/重连)、消息处理、心跳检测。
5. 动画与交互编排
拖拽状态、手势识别、多步骤动画序列的精确控制。
6. 后端工作流编排
审批流程、订单状态机、ETL 管道编排、微服务间的 Actor 通信。
7. 游戏逻辑与状态管理
游戏角色状态、关卡流程、AI 行为树。
开发与工程化
项目结构建议
src/
├── machines/ # 状态机定义
│ ├── auth.machine.ts
│ ├── checkout.machine.ts
│ └── notification.machine.ts
├── actors/ # Actor 逻辑
│ ├── fetch-data.actor.ts
│ └── websocket.actor.ts
├── components/ # UI 组件
│ ├── AuthForm.tsx
│ └── CheckoutWizard.tsx
└── hooks/ # 自定义 hooks(React)
└── useAuthMachine.ts
TypeScript 最佳实践
// 使用 setup() 获得完整的类型推导
import { setup, createActor } from 'xstate';
const machine = setup({
types: {} as {
context: { count: number };
events:
| { type: 'INCREMENT' }
| { type: 'DECREMENT' }
| { type: 'RESET' };
input: {} as { initialCount?: number };
}
}).createMachine({
id: 'counter',
initial: 'active',
context: ({ input }) => ({
count: input.initialCount ?? 0
}),
states: {
active: {
on: {
INCREMENT: { actions: assign({ count: ({ context }) => context.count + 1 }) },
DECREMENT: { actions: assign({ count: ({ context }) => context.count - 1 }) },
RESET: { actions: assign({ count: 0 }) }
}
}
}
});
// 类型安全的使用
const actor = createActor(machine, { input: { initialCount: 10 } });
actor.start();
actor.send({ type: 'INCREMENT' }); // ✅ 类型检查通过
// actor.send({ type: 'INVALID' }); // ❌ TypeScript 编译错误测试策略
import { createActor } from 'xstate';
import { assert } from 'xstate/assert';
// 使用 xstate-test 进行测试生成
import { createTestModel } from 'xstate/test';
import { myMachine } from './machines';
const model = createTestModel(myMachine);
model.testPath(
{ states: ['idle', 'loading'], events: ['FETCH'] },
async ({ snapshot, event }) => {
const actor = createActor(myMachine);
actor.start();
actor.send(event);
expect(actor.getSnapshot().value).toBe('loading');
}
);性能优化
- 使用
useSelector选择性地订阅状态片段,避免不必要的重渲染 - 将 Actor 实例化放在组件外部或使用
useRef保持引用 - 对大型并行状态机,拆分为独立的子 Actor
性能与安全
性能特点
| 维度 | 说明 |
|---|---|
| 包体积 | ~13 KB gzip(核心包),零依赖 |
| 状态转换速度 | 微秒级,纯函数转换无 DOM 操作 |
| 内存占用 | 与状态机复杂度正相关,通常极小 |
| Actor 开销 | 每个 Actor 实例约数百字节内存 |
| 序列化 | 快照可序列化,支持 postMessage 跨线程传递 |
性能注意事项
- 避免过深的嵌套状态:超过 5 层的嵌套会增加遍历开销
- 谨慎使用
always转换:可能导致无限循环 - Actor 数量控制:数百个并发 Actor 通常没问题,但数千个需要考虑池化
- Context 不可变更新:
assign每次创建新对象,大 context 对象可能有 GC 压力
安全考量
- 无
eval或new Function:XState 不使用不安全的代码执行 - 事件序列化:Actor 间传递的事件应为纯数据对象,避免传递函数引用
- 输入验证:事件载荷应在 Actor 入口做校验
- 第三方 Actor:从不可信来源创建的 Actor 需要限制其能力边界
- 无已知 CVE:截至 2026 年 7 月,XState 核心库无已知安全漏洞
技术对比
| 特性 | XState v5 | Redux Toolkit | MobX | Effector | Zustand |
|---|---|---|---|---|---|
| 范式 | 状态机 + Actor 模型 | Flux/Redux 单一 Store | 响应式 Observable | 事件驱动 Store | 轻量 Hook Store |
| 核心抽象 | 状态机、Actor、事件 | Store、Slice、Action | Observable、Reaction | Store、Event、Effect | Store、setState |
| TypeScript 支持 | 原生(v5 强类型推导) | 原生(RTK Query) | 原生 | 原生 | 原生 |
| 包体积 | ~13 KB gzip | ~10 KB gzip(core) | ~16 KB gzip | ~8 KB gzip | ~1 KB gzip |
| 学习曲线 | 陡峭(需理解状态图理论) | 中等(Redux 基础) | 低(类 OOP) | 中等 | 极低 |
| 可视化调试 | ✅ Stately Inspector | ✅ Redux DevTools | ✅ MobX DevTools | ✅ Inspector | ✅ DevTools |
| 时间旅行 | ✅ 快照可序列化 | ✅ Redux DevTools | 有限 | ✅ | 有限 |
| 异步处理 | ✅ 原生 Actor 模型 | 需 middleware(thunk/saga) | 原生 | ✅ 原生 Effect | 需额外方案 |
| 并发控制 | ✅ Actor 消息队列 | 手动管理 | 手动管理 | ✅ 原生 | 手动管理 |
| 状态不可达性检测 | ✅ 自动 | ❌ 手动测试 | ❌ 手动 | ❌ 手动 | ❌ 手动 |
| 框架绑定 | React(官方),Vue/Svelte/Solid(社区) | React(官方) | React/Vue/Angular | React/Vue/Svelte | React(官方) |
| npm 周下载量 | ~150 万 | ~1000 万+ | ~300 万 | ~20 万 | ~800 万 |
| GitHub Stars | ~29.7k | ~68k | ~28k | ~6k | ~48k |
| 适用场景 | 复杂流程、并发编排 | 全局状态 CRUD | 响应式 UI | 全栈类型安全 | 简单全局状态 |
何时选择 XState
- ✅ 应用有大量复杂的状态转换逻辑(多步骤流程、条件分支、并行状态)
- ✅ 需要管理多个并发异步操作(请求竞态、取消、重试)
- ✅ 团队需要可视化和文档化业务逻辑
- ✅ 需要保证所有状态都是合法的(消除不可达状态)
- ✅ 构建工作流编排系统
何时不选择 XState
- ❌ 只是简单的全局状态存取(用 Zustand 更合适)
- ❌ 团队不熟悉状态机概念且无学习预算
- ❌ 纯 UI 状态管理(loading、modal toggle 等用 React 内置 state 即可)
- ❌ 性能极敏感的超轻场景(Zustand/Jotai 包体积更小)
最佳实践
推荐模式
// ✅ 使用 setup() 进行类型安全定义
const machine = setup({
types: {} as { context: {...}; events: ... }
}).createMachine({ ... });
// ✅ 将 Actor 逻辑与 UI 分离
// machines/checkout.ts
export const checkoutMachine = createMachine({ ... });
// components/Checkout.tsx
const actor = useActor(checkoutMachine);
// ✅ 使用 fromPromise / fromCallback 封装副作用
const apiActor = fromPromise(async ({ input }) => {
return await api.getData(input.id);
});
// ✅ 使用 useSelector 优化 React 渲染
const status = useSelector(actor, (snapshot) => snapshot.value);
// ✅ 为复杂状态机编写状态图可视化
// 使用 Stately Studio 或 @statelyai/inspect常见陷阱
- ❌ 用状态机管理简单的 UI 状态(如 modal 开关、表单输入值)——过度设计
- ❌ 在 context 中存储函数或不可序列化的对象——破坏了 Actor 模型的通信约定
- ❌ 忘记处理所有可能的事件——导致未预期的状态转换
- ❌ 使用
always转换而不设置退出条件——导致无限循环 - ❌ 将业务逻辑分散在 actions 和 guards 中——应保持状态机的声明性和可预测性
- ❌ 在 React 组件内直接创建 Actor——每次重渲染都会重建,使用
useMemo或提升到外部
迁移建议
从 v4 迁移到 v5:
interpret()→createActor()- 内联 Promise 服务 →
fromPromise() - 内联回调服务 →
fromCallback() - 移除
schema属性中的 TypeScript 类型,改用setup({ types: {} }) - 使用 官方迁移指南 逐步完成
技术局限与边界
已知限制
- 学习曲线陡峭:需要理解有限状态机、状态图、Actor 模型等理论基础,对新手不友好
- TypeScript 类型推导仍有边界:虽然 v5 大幅改善,但复杂嵌套状态机和并行状态的类型推导仍可能不够精确
- 社区规模相对较小:相比 Redux/Zustand,XState 的社区教程、示例和 Stack Overflow 答案更少
- 调试体验不如 Redux:虽然有 Stately Inspector,但 Redux DevTools 的生态更成熟
- 部分 React 集成场景笨拙:对于 React hooks 驱动的应用,某些场景下 XState 的集成不如原生 hooks 自然
- Breaking Changes 频繁:v4 → v5 是一次大规模重构,v6 alpha 也在进行大量 API 变更,迁移成本较高
不适用场景
- 简单的表单状态管理(React Hook Form 或原生
useState更合适) - 纯客户端列表的增删改查(Redux Toolkit / Zustand 更轻量)
- 实时数据流处理(RxJS 更专业)
- 服务端渲染中的简单状态(React Server Components 可能直接消除需求)
权衡取舍
- 选择 XState 意味着选择正确性和可预测性,而非简洁性和上手速度
- XState 的 Actor 模型在复杂并发场景下优势巨大,但简单场景下会显得笨重
- 可视化调试是核心卖点之一,但依赖 Stately 工具链的持续投入
学习资源
官方资源
- XState 官方文档(stately.ai/docs)
- XState 官网(xstate.js.org)
- XState v5 迁移指南
- XState v5 发布公告
- Stately Studio(可视化编辑器)
- XState GitHub 仓库
书籍与课程
- XState: Complete Getting Started Guide(Typeonce)
- State Machines in JavaScript with XState(Frontend Masters)
- XState 中文文档
社区与文章
- State machines and Actors in XState v5(Sandro Maglione)
- XState: The Redux Alternative for Complex Application Logic(Medium)
- Guidelines for State Machines and XState(Kyle Shevlin)
- XState v6 Roadmap(GitHub Discussion)
视频
- Webinar: State Machines and Actors with XState v5(YouTube)
- Webinar: Get started with XState v5(YouTube)
2026 年现状
当前版本状态
| 版本线 | 版本号 | 发布日期 | 状态 |
|---|---|---|---|
| v5(稳定) | 5.32.4 | 2026-07-03 | ✅ 活跃维护 |
| v6(Alpha) | 6.0.0-alpha.16 | 2026-06-30 | 🧪 公开测试中 |
XState v5 最新变化(2025–2026)
- 持续迭代:v5 从 2023 年 12 月发布至今,已累积约 120 个版本,保持活跃的 patch 和 minor 更新
- TypeScript 类型增强:持续改进
setup()API 的类型推导能力 - Stately Inspector 稳定:
@statelyai/inspect取代旧版@xstate/inspect,成为官方推荐的调试工具 @xstate/store成熟:作为轻量级 Store 方案,为不需要完整状态机能力的场景提供简化入口
XState v6 Alpha 亮点
2026 年 6 月,David Khourshid 发布了 XState v6 的 alpha 预览,核心变更包括:
- 移除
assign()函数:Context 更新改为直接从转换函数返回{ context }补丁(注意:部分补丁会替换而非合并 context) - 引入
enq(Enqueue)对象:统一替代assign、sendParent、spawnChild等分散的函数导入 - 大幅精简 API:"移除了大量 API 表面积"(David Khourshid 原话)
- 新可视化编辑器预览:Stately Studio 的全新可视化编辑器进入预览阶段
- Effect 集成:计划与 Effect 库原生集成,Sandro Maglione 已发布相关教程
- 新
@xstate/store包:v4.3.0-alpha.2 与 v6 同步开发
社区活跃度
- GitHub Stars:~29.7k(2026 年 7 月)
- npm 周下载量:~150 万次
- GitHub 累计发布 534 个版本
- Stately AI 团队持续投入商业化和开源维护
- 社区对 v6 的反响积极,Sandro Maglione 已率先将完整代码库迁移到 v6 alpha
竞争格局(2026)
- Zustand 在简单全局状态领域持续领先(包积极、API 极简)
- Redux Toolkit 仍是企业级应用的主流选择
- Jotai 在原子化状态管理领域快速增长
- XState 的独特定位在于复杂逻辑编排和 Actor 模型,这是其他状态管理库无法替代的能力
- @xstate/store 试图进入轻量级 Store 市场与 Zustand 竞争,但市场接受度仍需观察
- XState v6 的 Effect 集成和 API 精简可能吸引更多 TypeScript 重度用户