Skip to content
⚠️ This article was written in 2020. Some content may be outdated.

XState 有限狀態機前端應用

關於XState 有限狀態機前端應用,很多開發者只停留在 API 調用層面。本文試圖從生產環境的角度,討論實際中會遇到的問題和解決方案。

基本原理

在這個基礎上,我們可以進一步優化:

javascript
import { create } from 'zustand'
import { persist, devtools } from 'zustand/middleware'

const useStore = create(
  devtools(persist(
    (set, get) => ({
      user: null,
      theme: 'light',
      notifications: [],
      setUser: (user) => set({ user }),
      toggleTheme: () => set(s => ({
        theme: s.theme === 'light' ? 'dark' : 'light'
      })),
      unreadCount: () => get().notifications.filter(n => !n.read).length
    }),
    { name: 'app-store' }
  ))
)

這種模式在大型項目中非常實用,能顯著降低維護成本。

高級特性

實際項目中的用法會更復雜一些:

javascript
import { create } from 'zustand'
import { persist, devtools } from 'zustand/middleware'

const useStore = create(
  devtools(persist(
    (set, get) => ({
      user: null,
      theme: 'light',
      notifications: [],
      setUser: (user) => set({ user }),
      toggleTheme: () => set(s => ({
        theme: s.theme === 'light' ? 'dark' : 'light'
      })),
      unreadCount: () => get().notifications.filter(n => !n.read).length
    }),
    { name: 'app-store' }
  ))
)

通過這種方式,代碼的可測試性和可擴展性都得到了提升。

項目實踐

以下是一個完整的示例:

javascript
import { create } from 'zustand'
import { persist, devtools } from 'zustand/middleware'

const useStore = create(
  devtools(persist(
    (set, get) => ({
      user: null,
      theme: 'light',
      notifications: [],
      setUser: (user) => set({ user }),
      toggleTheme: () => set(s => ({
        theme: s.theme === 'light' ? 'dark' : 'light'
      })),
      unreadCount: () => get().notifications.filter(n => !n.read).length
    }),
    { name: 'app-store' }
  ))
)

注意邊界條件處理,這在生產環境中至關重要。

最佳實踐

關鍵在於理解核心邏輯:

javascript
import { create } from 'zustand'
import { persist, devtools } from 'zustand/middleware'

const useStore = create(
  devtools(persist(
    (set, get) => ({
      user: null,
      theme: 'light',
      notifications: [],
      setUser: (user) => set({ user }),
      toggleTheme: () => set(s => ({
        theme: s.theme === 'light' ? 'dark' : 'light'
      })),
      unreadCount: () => get().notifications.filter(n => !n.read).length
    }),
    { name: 'app-store' }
  ))
)

性能優化需要結合具體場景,不是所有情況都需要過度優化。

踩坑記錄

我們可以通過以下方式來改進:

javascript
import { create } from 'zustand'
import { persist, devtools } from 'zustand/middleware'

const useStore = create(
  devtools(persist(
    (set, get) => ({
      user: null,
      theme: 'light',
      notifications: [],
      setUser: (user) => set({ user }),
      toggleTheme: () => set(s => ({
        theme: s.theme === 'light' ? 'dark' : 'light'
      })),
      unreadCount: () => get().notifications.filter(n => !n.read).length
    }),
    { name: 'app-store' }
  ))
)

這套方案已經在線上穩定運行了半年以上,經過了實際驗證。

小結

  • XState 有限狀態機前端應用不是銀彈,需要根據項目規模和技術棧選擇
  • 理解底層原理比記住 API 更重要
  • 生產環境使用前務必做好兼容性驗證
  • 團隊協作中約定和文檔比技術本身更重要

MIT Licensed