@core 基础设施
@skyroc/core-state
Jotai 状态封装,提供全局 store、持久化 atom 与存储注册表
概览
| 项 | 值 |
|---|---|
| 包名 | @skyroc/core-state |
| 版本 | 1.0.0 |
| peer 依赖 | jotai >= 2.0.0、react >= 18.0.0 |
| 测试 | ✅ 6 个测试文件 |
封装 Jotai,提供一个包级单一 store,并解决两个常见问题:在 React 之外读写 atom、以及 atom 持久化与存储后端解耦。
核心导出
| 类别 | 导出 |
|---|---|
| Provider | JotaiProvider |
| 全局 store | globalStore、getAtomValue、setAtomValue、updateAtomValue |
| 持久化 | createAtomWithStorage、atomWithPartial |
| 存储注册表 | registerStorage、getStorage、hasStorage、unregisterStorage |
架构
StorageRegistry(注册存储适配器)
↓
globalStore(createStore,React 内外通用)
↓
atom / createAtomWithStorage(持久化 atom)
↓
JotaiProvider(<Provider store={globalStore}>)全局 store:在 React 外读写
import { globalStore, getAtomValue, setAtomValue, updateAtomValue } from '@skyroc/core-state';
// 在拦截器、工具函数等非组件代码里读写 atom
const token = getAtomValue(tokenAtom);
setAtomValue(tokenAtom, 'new-token');
updateAtomValue(countAtom, c => c + 1);应用在最外层挂载 JotaiProvider,保证组件树与 globalStore 用的是同一个 store。
存储注册表:解耦持久化后端
不同平台的存储不同(Web localStorage、RN AsyncStorage)。注册表让 atom 不直接依赖具体存储:
import { registerStorage, createAtomWithStorage } from '@skyroc/core-state';
// 应用启动时注册一个存储适配器
registerStorage('local', {
getItem: k => localStorage.getItem(k),
setItem: (k, v) => localStorage.setItem(k, v),
removeItem: k => localStorage.removeItem(k)
});
// 创建持久化 atom,引用注册表里的 'local'
const themeAtom = createAtomWithStorage('theme', 'light', { storage: 'local' });AtomStorage 接口:getItem / setItem / removeItem / 可选 subscribe。
部分更新 atom
atomWithPartial 支持「只更新部分字段」并自带 no-op 检测(Object.is 比较,无变化不触发更新):
import { atomWithPartial } from '@skyroc/core-state';
const settingsAtom = atomWithPartial({ theme: 'light', lang: 'zh-CN' });
// 更新时只传部分字段
set(settingsAtom, { theme: 'dark' });在应用中的应用
Admin 应用通过本包的 JotaiProvider + globalStore 统一状态:主题、语言、菜单、标签页等 atom 都挂在同一个 store 上,并用 useAtom(..., { store: globalStore }) 对齐。详见 Admin 状态管理。