# Flux 3

> 来源：[HackerNews](https://bfl.ai/blog/flux-3)

# Flux 3：下一代前端状态管理的新范式

## 背景与概述

在前端开发的世界里，状态管理始终是一个绕不开的核心话题。从早期的 MVC 模式到 React 生态中的 Flux 架构，再到 Redux、MobX、Zustand 等百花齐放的解决方案，开发者们一直在寻找更优雅、更高效的方式来管理应用状态。近日，Black Forest Labs 发布了 Flux 3，这一消息迅速在 HackerNews 上引发了广泛关注。

Flux 3 并非简单的版本迭代，而是对传统 Flux 架构的一次深度重构。它继承了 Flux 单向数据流的核心思想，同时引入了更现代化的响应式机制和类型安全支持。对于经历过 Redux 繁琐样板代码、或者对 Zustand 轻量但缺乏约束感到困扰的开发者来说，Flux 3 试图在“灵活性”与“规范性”之间找到新的平衡点。

值得注意的是，Flux 3 的发布恰逢前端社区对“信号（Signals）”模式讨论火热之际。Vue 的 ref、Solid.js 的信号、Preact Signals 等都在探索更细粒度的响应式更新。Flux 3 是否能够融合这些先进理念，同时保持 Flux 架构的清晰性？这正是本文要深入探讨的。

## 核心内容

### 1. 声明式状态定义与类型安全

Flux 3 最显著的变化在于状态定义方式。传统 Flux 中，我们需要手动创建 Store、定义 Action Type 常量、编写 Reducer，流程繁琐且容易出错。Flux 3 引入了 `defineStore` API，允许开发者以声明式的方式定义状态、计算属性和方法：

```javascript
import { defineStore } from 'flux-3';

const useCounterStore = defineStore({
  state: () => ({
    count: 0,
    step: 1,
  }),
  computed: {
    doubleCount: (state) => state.count * 2,
  },
  actions: {
    increment() {
      this.count += this.step;
    },
    decrement() {
      this.count -= this.step;
    },
  },
});
```

这种设计借鉴了 Vue 3 的 Composition API 和 Pinia 的语法，但底层采用了更高效的响应式系统。更重要的是，Flux 3 原生支持 TypeScript，所有状态和动作都会自动推导类型，无需额外编写类型声明。

### 2. 细粒度响应式更新

Flux 3 放弃了传统的不可变数据模式，转而采用基于 Proxy 的响应式系统。这意味着当状态发生变化时，只有真正依赖该状态的组件才会重新渲染，而不是整个组件树。

```javascript
// 传统 Flux 需要手动返回新对象
// return { ...state, count: state.count + 1 };

// Flux 3 直接修改
this.count += 1; // 自动触发更新
```

这种设计大幅减少了不必要的渲染，尤其适合大型表单、实时数据仪表盘等场景。同时，Flux 3 提供了 `watch` 函数，可以监听特定状态的变化并执行副作用：

```javascript
const store = useCounterStore();

watch(() => store.count, (newVal, oldVal) => {
  console.log(`Count changed from ${oldVal} to ${newVal}`);
});
```

### 3. 模块化与依赖注入

Flux 3 引入了模块化 Store 的概念，允许开发者将大型应用的状态拆分为多个独立的 Store，并通过依赖注入实现跨 Store 通信：

```javascript
const useUserStore = defineStore({
  state: () => ({ name: '', role: '' }),
});

const usePermissionStore = defineStore({
  state: () => ({ permissions: [] }),
  actions: {
    async fetchPermissions() {
      const userStore = useUserStore();
      this.permissions = await api.getPermissions(userStore.role);
    },
  },
});
```

这种模式避免了全局 Store 的臃肿，同时保持了组件间状态共享的便利性。每个 Store 都可以独立测试，大大提升了代码的可维护性。

## 技术分析

Flux 3 的底层实现基于三个核心技术：

1. **Proxy 响应式系统**：与 Vue 3 类似，Flux 3 使用 JavaScript Proxy 来拦截对象属性的读取和写入操作。当状态被读取时，自动建立依赖追踪；当状态被修改时，触发对应订阅者的更新。这种机制比 Redux 的不可变数据 + 浅比较更高效，也比 MobX 的装饰器模式更简洁。

2. **微任务调度**：Flux 3 的更新机制采用了微任务（Microtask）调度。当多个状态变更在同一个事件循环中发生时，它们会被批量处理，只触发一次视图更新。这类似于 React 的批处理机制，但粒度更细——只更新真正受影响的组件。

3. **类型推导引擎**：Flux 3 内置了强大的类型推导引擎，能够从 `state`、`computed`、`actions` 的定义中自动生成完整的类型信息。这意味着开发者无需手动编写 `interface` 或 `type`，TypeScript 就能自动推断出 Store 的结构。

```typescript
// 自动推导出的类型
const store = useCounterStore();
store.count; // number
store.doubleCount; // number
store.increment(); // () => void
```

## 实践建议

对于想要尝试 Flux 3 的开发者，这里有一些实用建议：

### 1. 从小项目开始迁移

不建议立即将大型 Redux 项目迁移到 Flux 3。可以先在新模块或小型功能中试用，例如表单管理、UI 状态等。Flux 3 的 `defineStore` API 与 React Hooks 天然兼容，可以逐步替换。

### 2. 合理拆分 Store

避免创建“上帝 Store”（一个 Store 包含所有状态）。按照业务模块或功能域拆分，每个 Store 负责独立的状态逻辑。对于跨 Store 通信，使用依赖注入而非事件总线。

### 3. 利用计算属性优化性能

对于需要派生状态的地方，优先使用 `computed` 而非在组件中手动计算。Flux 3 的计算属性是惰性求值的，只有依赖变化时才会重新计算，并且结果会被缓存：

```javascript
computed: {
  // 只有当 todos 或 filter 变化时才会重新计算
  filteredTodos: (state) => {
    return state.todos.filter(todo => {
      if (state.filter === 'completed') return todo.done;
      if (state.filter === 'active') return !todo.done;
      return true;
    });
  },
}
```

### 4. 结合 React 的 Suspense 和 Server Components

Flux 3 的异步动作支持与 React 的 Suspense 配合良好。可以在动作中使用 `await` 获取数据，并在组件中使用 `Suspense` 处理加载状态：

```javascript
const useDataStore = defineStore({
  state: () => ({ data: null }),
  actions: {
    async fetchData() {
      this.data = await api.getData();
    },
  },
});

// 在组件中
function DataComponent() {
  const store = useDataStore();
  if (!store.data) throw store.fetchData(); // 触发 Suspense
  return <div>{store.data}</div>;
}
```

## 总结

Flux 3 代表了前端状态管理的一个重要演进方向。它没有盲目追随“信号”热潮，而是在保持 Flux 架构清晰性的基础上，吸收了响应式编程和类型安全的优点。对于中小型项目，Flux 3 提供了足够的灵活性；对于大型项目，它的模块化和类型推导能力又能保证代码的可维护性。虽然 Flux 3 目前还处于早期阶段，但它已经展现出了成为下一代主流状态管理工具的潜力。对于追求开发效率和代码质量的团队来说，Flux 3 值得投入时间学习和尝试。