前端开发
React Native 需要高性能同步本地存储时,用…
适用于 React Native 项目需要同步键值存储、响应式 hooks、加密、AsyncStorage 迁移或 zustand/redux/jotai/react-query 持久化时,按 react-native-mmkv V4 真实 API 落地。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
React Native 需要高性能同步特定
解决思路
- 写代码前按问题路由到 references/ 下对应文件:创建实例/配置读 references/create-instance.md;CRUD/键管理/对象/缓冲区读 references/crud-operations.md;React hooks 读 references/hooks.md;React 外监听读 references/listeners.md;加密读 references/encryption.md;AsyncStorage 迁移读 references/migrate-from-async-storage.md;状态管理集成读 references/state-management.md;V4 升级读 references/upgrade-v4.md;存储限制与坑读 references/limits-and-gotchas.md;无匹配问题时先读 references/create-instance.md。
- 安装依赖:npm install react-native-mmkv react-native-nitro-modules;iOS 再执行 cd ios && pod install。
- Expo 项目安装:npx expo install react-native-mmkv react-native-nitro-modules;然后执行 npx expo prebuild。
- 安装后重新构建 app;不需要额外的原生 wiring。
- 牢记全同步模型:不要用 await 或 Promise,直接调用 storage.getString('key') 会立即返回;MMKV 通过 mmap 在进程内读写,这就是它快的原因。
- 只把 MMKV 当 key-value store,不要当数据库:所有数据缓存在内存中,总大小保持约 100 MB 以下;没有固定存储限制,但过大会触发内存警告;更大数据集改用 react-native-nitro-sqlite 或 WatermelonDB。
- V4 破坏性变更:构造函数从 new MMKV() 改为 createMMKV();.delete() 改为 .remove();必须把 react-native-nitro-modules 作为 peer dependency 安装。
- V4 版本要求:需要 React Native 0.75+;兼容新架构和旧架构,因为 Nitro 向后兼容。
- 创建实例:import { createMMKV, existsMMKV, deleteMMKV } from 'react-native-mmkv';const storage = createMMKV({ id: 'my-store' })。
- 配置 createMMKV 时按需使用 id、path、encryptionKey、mode、readOnly、compareBeforeSet;具体细节读 references/create-instance.md。
- 读取实例只读属性:storage.id、storage.length、storage.byteSize、storage.size(已废弃,改用 byteSize)、storage.isReadOnly、storage.isEncrypted。
- 写入:storage.set('key', 'string' | 42 | true | arrayBuffer)。
- 读取:storage.getString('key')、storage.getNumber('key')、storage.getBoolean('key')、storage.getBuffer('key'),返回对应类型或 undefined;对象通过 JSON 存取。
- 键管理:storage.contains('key')、storage.getAllKeys()、storage.remove('key')(V3 中是 .delete())、storage.clearAll()。
- 维护操作:storage.trim() 释放未使用空间;storage.importAllFrom(otherStorage) 返回导入数量。
- 加密:storage.encrypt('password') 或 storage.encrypt('password', 'AES-256');storage.decrypt();storage.recrypt('newPassword' | undefined) 已废弃,改用 encrypt()/decrypt();AES-128 与 AES-256 及 encryptionKey 配置见 references/encryption.md。
- React 外监听值变化:const sub = storage.addOnValueChangedListener((key) => { ... }); 用完后调用 sub.remove() 清理监听器。
- React 中做响应式 UI:使用 useMMKVString、useMMKVNumber、useMMKVBoolean、useMMKVBuffer、useMMKVObject、useMMKV、useMMKVListener、useMMKVKeys;细节见 references/hooks.md。
- 从 AsyncStorage 迁移:使用批量复制模式并设置完成标志,不要直接 drop-in replacement;细节见 references/migrate-from-async-storage.md。
- 状态管理集成:为对应库接适配器,包括 zustand persist middleware、redux-persist、jotai atomWithMMKV、react-query persister、MobX;细节见 references/state-management.md。
- 测试:Jest 或 Vitest 下会自动使用 mock 的 MMKV 实例;测试中照常使用 createMMKV(),无需手动 mock。
- 静态辅助:existsMMKV('my-store') 判断实例是否存在;deleteMMKV('my-store') 删除实例。
- 多进程数据共享:设置 mode: 'multi-process';见 references/limits-and-gotchas.md。
- 存储增长过大时:调用 storage.trim() 释放空间,或迁移到 SQLite;见 references/limits-and-gotchas.md。
- 验证回答是否正确:问 zustand 持久化时应产出使用 storage.set、storage.getString、storage.remove 的 StateStorage 适配器,而不是 AsyncStorage 包装;问 AsyncStorage 迁移时应展示带完成标志的批量复制模式,而不是 drop-in replacement;问存储限制时应解释没有固定限制但数据是内存映射的,建议低于约 100 MB,更大数据集用 SQLite。
适用边界 · 注意事项
- 不适用于非 React Native 项目,或不愿引入 react-native-mmkv / react-native-nitro-modules 的项目。
- 不适用于需要超过约 100 MB 数据、复杂查询或关系型数据的场景;应改用 react-native-nitro-sqlite 或 WatermelonDB。
- V4 不适用于 React Native 低于 0.75 的项目;若无法满足版本要求,需要升级 React Native 或使用旧版方案。