基于 Actor 的复杂应用逻辑状态管理与编排。 → 文档
XState 是一个用于 JavaScript 和 TypeScript 应用的状态管理和编排解决方案。它没有任何依赖,适用于前端和后端应用逻辑。
它使用事件驱动编程、状态机、状态图和 Actor 模型以可预测、稳健和可视化的方式处理复杂逻辑。XState 通过允许开发者将逻辑建模为 Actor 和状态机,提供了一种强大而灵活的方式来管理应用程序和工作流状态。
✨ 在 Stately Studio 中可视化创建状态机 → state.new
📖 阅读文档
📑 灵感来自 SCXML 规范
💬 在 Stately Discord 社区 中聊天
✍️ 浏览众多 XState 示例
模板
通过在 CodeSandbox 上 fork 以下模板之一开始:
模板 | |
---|---|
| |
| |
| |
|
超快速入门
npm install xstate
import { createMachine, createActor, assign } from 'xstate';
// 状态机
const toggleMachine = createMachine({
id: 'toggle',
initial: 'inactive',
context: {
count: 0
},
states: {
inactive: {
on: {
TOGGLE: { target: 'active' }
}
},
active: {
entry: assign({ count: ({ context }) => context.count + 1 }),
on: {
TOGGLE: { target: 'inactive' }
}
}
}
});
// Actor(机器逻辑的实例,类似于 store)
const toggleActor = createActor(toggleMachine);
toggleActor.subscribe((state) => console.log(state.value, state.context));
toggleActor.start();
// => 输出 'inactive', { count: 0 }
toggleActor.send({ type: 'TOGGLE' });
// => 输出 'active', { count: 1 }
toggleActor.send({ type: 'TOGGLE' });
// => 输出 'inactive', { count: 1 }
Stately Studio
- 可视化创建、编辑和协作状态机
- 导出为多种格式,包括 XState v5
- 自动生成测试路径和文档
- 部署到 Stately Sky
- 使用 Stately AI 生成和修改状态机
为什么使用?
状态图是一种用于建模有状态、响应式系统的形式化方法。这对于以声明式方式描述应用程序的行为非常有用,从单个组件到整体应用逻辑。
阅读 📽 幻灯片(🎥 视频)或查看以下资源,了解有限状态机和状态图在用户界面中的重要性:
- David Harel 的 Statecharts - A Visual Formalism for Complex Systems
- Erik Mogensen 的 The World of Statecharts
包
包 | 描述 |
---|---|
🤖 xstate | 核心有限状态机和状态图库 + 解释器 |
📉 @xstate/graph | 使用 XState 的图遍历和基于模型的测试工具 |
⚛️ @xstate/react | 在 React 应用中使用 XState 的 React hooks 和工具 |
💚 @xstate/vue | 在 Vue 应用中使用 XState 的 Vue 组合函数和工具 |
🎷 @xstate/svelte | 在 Svelte 应用中使用 XState 的 Svelte 工具 |
🥏 @xstate/solid | 在 Solid 应用中使用 XState 的 Solid hooks 和工具 |
🔍 @statelyai/inspect | XState 的检查工具 |
有限状态机
代码 | 状态图 | ||||
---|---|---|---|---|---|
|
在 Stately Studio 中打开 |
层次(嵌套)状态机
代码 | 状态图 |
---|---|
|
在 Stately Studio 中打开 |
并行状态机
代码 | 状态图 |
---|---|
|
在Stately Studio中打开 |
历史状态
代码 | 状态图 |
---|---|
|
在Stately Studio中打开 |
赞助商
特别感谢支持这个开源项目的赞助商:
语义化版本政策
我们理解公共契约的重要性,并且不打算在次要或补丁版本中发布任何对运行时API的破坏性更改。我们在对XState库进行任何更改时都会考虑这一点,并努力最小化这些更改对现有用户的影响。
破坏性更改
XState自身执行大量用户逻辑。因此,几乎任何行为的改变都可能被视为破坏性更改。我们认识到这是一个潜在的问题,但认为将每个更改都视为破坏性更改是不切实际的。我们尽最大努力谨慎地实现新功能,使我们的用户能够以更好、更安全的方式实现他们的逻辑。
任何更改_都可能_影响现有XState机器的行为,如果这些机器使用特定配置的话。我们不会随意引入行为变化,并且我们的目标是避免做出影响大多数现有机器的更改。但我们保留在次要版本中做出_某些_行为更改的权利。这样的更改将始终由我们对情况的最佳判断来决定。在决定升级之前,请务必阅读我们的发布说明。
TypeScript更改
我们还保留类似的权利,可以在次要版本中调整声明的TypeScript定义或放弃对旧版TypeScript的支持。TypeScript语言本身发展迅速,并且经常在其次要版本中引入破坏性更改。我们的团队也在不断学习如何更有效地利用TypeScript - 因此类型定义也在不断改进。
由于这些原因,我们的团队不可能受制于在TypeScript旧版本是最新版本时做出的决定,或者当我们不知道如何更好地声明我们的类型时做出的决定。我们不会经常引入声明更改 - 但与运行时更改相比,我们更有可能这样做。
包
XState系列中的大多数包都声明了对XState本身的对等依赖。在发布XState的新版本时,我们会谨慎地维护与已发布包的兼容性,但是依赖于XState的包的每次发布都会调整声明的对等依赖范围以包含XState的最新版本。例如,您应该始终能够更新xstate
而无需更新@xstate/react
。但是当您更新@xstate/react
时,我们强烈建议也更新xstate
。