有限状态机(FSM) 与 前端

Apr 11, 2025

Green Fern

有限状态机

有限状态机(FSM)用来说明系统在有限个状态之间如何根据输入或事件进行转换。在软件开发中,FSM 的应用非常常见,尤其是在管理复杂的状态逻辑时,能够让代码更清晰、可预测和易于维护。

FSM 由以下几个核心部分组成:

  • 状态(States):系统在某一时刻所处的有限个状态之一

  • 事件(Events):触发状态转换或触发action

  • 转换(Transitions):从一个状态到另一个状态的规则

  • 初始状态(Initial State):系统开始时的状态

  • 结束状态(Final State):可选的终止状态


有限状态机与前端

状态机建模复杂页面逻辑可以实现逻辑层与 UI 层的分离,这种分离给前端开发中带来的很多便利。逻辑层通过状态机管理状态和行为,UI 层根据状态渲染视图,二者通过事件双向通信、状态单向通信。这种分离提高了代码的可维护性,并且可测试。尤其适合复杂页面逻辑的场景。

场景一:在敏捷开发中需求变更频繁、迭代周期短的场景下,UI 经常根据用户反馈、产品经理的需求或设计调整而频繁变更。使用状态机分离后,UI 层只是状态的“消费者”,所有业务逻辑和状态管理集中在状态机中。在传统的紧耦合代码中,UI 修改可能意外影响状态管理逻辑(如误删某个条件判断)。状态机分离后,逻辑层是独立且稳定的,UI 修改不会干扰状态转换规则,降低了因频繁调整引入 Bug 的风险。

场景二:敏捷团队常需要快速验证设计方案或进行 A/B 测试。状态机分离后,可以轻松为同一个状态机绑定不同的 UI 实现。例如: 状态机保持不变,一个 UI 版本显示简洁a版本,另一个版本显示详细b版本。 切换 UI 实现只需替换视图层代码,逻辑层无需改动,缩短了试错周期。

场景三:前端并行开发更顺畅,前端UI 开发者可以专注于视图调整,快速响应设计需求。 前端逻辑开发者可以并行完善状态机或业务规则。 这种分工减少了代码冲突,提升了团队效率。

场景四:适应需求变更灵活,乐于拥抱变化。状态机的声明式设计使得新增状态或调整转换规则相对容易。例如,如果产品经理临时要求在提交失败后添加“重试”功能,只需在状态机中增加一个状态(如 retrying)和对应的转换,UI 层再根据新状态渲染按钮即可,无需重构现有代码。

需要注意的地方

  • 依赖团队对状态机的熟悉程度,敏捷开发强调速度,如果团队对状态机不熟悉,可能反而拖慢进度。需要确保团队有一定的学习和适应时间。

  • 状态机的设计和搭建需要前期规划,对于短周期迭代,团队可能觉得直接写条件逻辑更快。如果每次迭代都涉及逻辑调整,状态机的优势可能被削弱。

XState

XState 是一个用于 JavaScript 和 TypeScript 的状态机和状态图的库,XState 可帮助您管理 React 中的本地和全局组件状态。同时可以使用状态机和状态图对状态进行建模,然后在应用中使用它们来编排复杂的应用逻辑。我们还将实时可视化状态机,并可以测试状态机。

Zag.js

由有限状态机驱动的 UI 组件一系列与框架无关的 UI 组件模式,可用于构建 React、Vue、Solid.js 和 Svelte 的设计系统。