)
【免費下載鏈接】react-native-mmkv?? The fastest key/value storage for React Native. ~30x faster than AsyncStorage!項目地址https://gitcode.com/gh_mirrors/re/react-native-mmkv點擊查看免費下載本文基于倉庫文檔 docs/WRAPPER_REDUX.md 展開講解如何把 react-native-mmkv 接入 redux-persist實現(xiàn) Redux 狀態(tài)的持久化。讀完你將掌握官方 Storage 封裝對象的完整寫法、三個接口方法與 MMKV 原生 API 的映射關系以及如何通過Configuration為持久化實例定制 ID、加密與寫入策略并理解其在 Web 端與測試環(huán)境下的實際行為。為什么 redux-persist 需要自定義 Storageredux-persist 的持久化機制被抽象成一個Storage接口只要求實現(xiàn)三個方法setItem(key, value)寫入一個鍵值對getItem(key)讀取指定鍵的值removeItem(key)刪除指定鍵。三個方法都返回 Promise或字符串值redux-persist 在persistStore啟動時會調(diào)用getItem完成 rehydration狀態(tài)回水此后每次被持久化的 reducer 狀態(tài)變化都會觸發(fā)setItem。默認生態(tài)中普遍搭配 AsyncStorage但 AsyncStorage 是異步 I/O狀態(tài)恢復路徑上要經(jīng)過多次 Promise 往返。react-native-mmkv 的賣點正在于同步讀寫——項目 README 將其定位為最快的 React Native key/value 存儲方案。由于 MMKV 的所有讀寫都是同步完成的把它包一層 Promise 即可無縫替換 AsyncStorage 的位置這也是 README.md 在 Use with Redux 部分指向 redux-persist 文檔 的原因見 README.md#L299。官方最小封裝完整可復制的 storage 對象按照 docs/WRAPPER_REDUX.md 給出的示例創(chuàng)建如下storage對象即可import { Storage } from redux-persist import { createMMKV } from react-native-mmkv const storage createMMKV() export const reduxStorage: Storage { setItem: (key, value) { storage.set(key, value) return Promise.resolve(true) }, getItem: (key) { const value storage.getString(key) return Promise.resolve(value) }, removeItem: (key) { storage.remove(key) return Promise.resolve() }, }逐行說明這段封裝的關鍵點createMMKV()不帶參數(shù)創(chuàng)建的是默認實例。從 createMMKV.ts#L19 可以看到缺省配置為{ id: factory.defaultMMKVInstanceId }而默認 ID 常量是mmkv.default見 MMKVFactory.nitro.ts#L139-L143。也就是說 redux-persist 的數(shù)據(jù)會落在mmkv.default這個 MMKV 文件中與應用里其他默認實例的鍵共享命名空間——鍵名需自行避免沖突。setItem內(nèi)部調(diào)用storage.set(key, value)。redux-persist 序列化的狀態(tài)是 JSON 字符串而set的簽名是set(key: string, value: boolean | string | number | ArrayBuffer)見 MMKV.nitro.ts#L44字符串是受支持的類型。由于set同步執(zhí)行完畢Promise.resolve(true)只是為適配Storage接口的異步簽名。getItem用getString(key)讀取。getString的返回類型是string | undefined見 MMKV.nitro.ts#L56鍵不存在時返回undefined這正是 redux-persist 期望的尚無持久化數(shù)據(jù)語義。removeItem調(diào)用storage.remove(key)該同步方法本身返回是否刪除成功的布爾值見 MMKV.nitro.ts#L77封裝里未使用該返回值直接 resolve 空值。值得強調(diào)的是這三個方法里沒有任何 await 或平臺通道往返Promise 是立即兌現(xiàn)的假異步。這意味著 redux-persist 的 rehydration 路徑可以完全同步完成這是相對 AsyncStorage 方案的核心收益。底層實現(xiàn)createMMKV 到底做了什么上面封裝中的createMMKV()并非簡單的工廠調(diào)用其內(nèi)部流程可以從源碼確認createMMKV.ts#L10-L39測試環(huán)境短路若檢測到 jest 環(huán)境isTest()直接返回內(nèi)存 mock 實例createMockMMKV。因此你在單元測試中 import 上面的reduxStorage時讀寫全部落在內(nèi)存里不會觸碰原生模塊懶加載原生工廠首次創(chuàng)建時通過NitroModules.createHybridObject(MMKVFactory)創(chuàng)建 C HybridObject并用平臺上下文的基礎目錄調(diào)用initializeMMKV一次性初始化 MMKV 庫見 getMMKVFactory.ts#L18-L27iOS App Group 處理在 iOS 上如果Info.plist配置了 App Group 且未顯式指定path會自動改用 App Group 目錄存儲使 Widget、App Extension 可共享同一份持久化數(shù)據(jù)見 createMMKV.ts#L21-L31生命周期鉤子實例創(chuàng)建后會自動注冊內(nèi)存告警監(jiān)聽收到系統(tǒng)內(nèi)存告警時觸發(fā)trim()和前臺內(nèi)容變更檢查從 App Extension / App Clip / 后臺服務寫回時重新加載見 createMMKV.ts#L35-L38。這些副作用對 redux-persist 是透明的但解釋了為什么官方示例不需要用戶做任何額外初始化——createMMKV()一行就覆蓋了庫初始化、平臺適配與生命周期管理。定制持久化實例Configuration 參數(shù)詳解createMMKV(configuration?)接受一個 Configuration 對象。對于 redux-persist 場景最有用的參數(shù)如下默認值取自 MMKVFactory.nitro.ts 中的注釋參數(shù)類型默認值對 redux-persist 場景的意義idstringmmkv.default多個 MMKV 實例互相隔離。建議為持久化狀態(tài)單獨指定 ID如redux-persist-store避免與普通業(yè)務鍵混在同一文件pathstring?undefined默認$(Documents)/mmkv/自定義存儲根目錄Web 端不支持encryptionKeystring?undefined對存儲文件整體加密。若 Redux 狀態(tài)中可能包含敏感數(shù)據(jù)token、用戶資料建議啟用encryptionTypeAES-128 \| AES-256AES-128指定加密算法AES-128 密鑰須 16 字節(jié)AES-256 須 32 字節(jié)modesingle-process \| multi-processsingle-process若持久化數(shù)據(jù)需要被 Widget 等擴展進程讀取應設為multi-processreadOnlybooleanfalseredux-persist 需要寫入保持falsecompareBeforeSetbooleanfalse寫入前比較新舊值相同則跳過落盤。redux-persist 在狀態(tài)高頻抖動時可能重復寫入相同內(nèi)容打開此項可減少無謂寫盤recoveryStrategydiscard-on-error \| recover-on-errorundefined檢測到 CRC/文件長度錯誤時的恢復策略持久化用戶數(shù)據(jù)時可考慮recover-on-error示例為持久化狀態(tài)建立獨立、加密、抗抖動的實例import { Storage } from redux-persist import { createMMKV } from react-native-mmkv const storage createMMKV({ id: redux-persist-store, encryptionKey: my-encryption-key!, // 16 字節(jié)AES-128 encryptionType: AES-256 as const, // 若用 AES-256 則密鑰需 32 字節(jié) compareBeforeSet: true, }) export const reduxStorage: Storage { setItem: (key, value) { storage.set(key, value) return Promise.resolve(true) }, getItem: (key) Promise.resolve(storage.getString(key)), removeItem: (key) { storage.remove(key) return Promise.resolve() }, }注意compareBeforeSet的取舍它會引入一次值比較換取值未變化時不落盤。從 MMKVFactory.nitro.ts#L96-L103 的注釋看官方將其定位為可選的性能優(yōu)化對 redux-persist 這類每次 dispatched 相關 action 都可能觸發(fā)持久化的寫入模式比較契合。接入 Redux storepersistStore 的典型用法封裝好reduxStorage后按 redux-persist 的常規(guī)方式接入即可。下面是一個與本文封裝配套的典型接線示例redux-persist 側(cè)的用法屬于該庫的標準 APIimport { legacy_createStore as createStore } from redux import { persistStore, persistReducer, FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER } from redux-persist import { reduxStorage } from ./reduxStorage // 上文封裝出的 Storage const persistConfig { key: root, storage: reduxStorage, // 只持久化需要落盤的 reducer 分支 whitelist: [settings, session], } const rootReducer combineReducers({ settings: settingsReducer, session: sessionReducer, transient: transientReducer, // 不進入白名單不會被持久化 }) const persistedReducer persistReducer(persistConfig, rootReducer) const store createStore(persistedReducer) const persistor persistStore(store)兩個與 MMKV 直接相關的細節(jié)persistConfig.key上例為root就是最終傳給reduxStorage.setItem的 key它會被寫入mmkv.default或你自定義 ID 的實例文件whitelist/reducerWhitelist控制哪些 reducer 的狀態(tài)參與序列化。MMKV 單實例的鍵空間是扁平的把整個 Redux 樹壓縮成一個 JSON 字符串存于單一 key正是 redux-persist 的設計如需拆分多個 key可自行擴展封裝讓setItem按state.storage分片寫入不同鍵——這屬于在官方封裝之上的自由發(fā)揮官方文檔未涉及。配合PersistGate可以在 rehydration 完成前阻塞渲染。由于 MMKV 讀取是同步的persistor的REHYDRATE事件幾乎立即觸發(fā)冷啟動時等待持久化數(shù)據(jù)基本沒有可感知的延遲。Web 端與測試環(huán)境的行為差異Web。react-native-mmkv 在 Web 上有獨立的 localStorage 實現(xiàn)createMMKV.web.ts上面的封裝代碼無需修改即可運行。該實現(xiàn)的關鍵限制createMMKV.web.ts#L10-L28encryptionKey與path兩個配置項會直接拋錯Web 端不支持加密與自定義路徑每個 MMKV 實例的鍵都會加上${id}\\前綴keyPrefix以此在 localStorage 中模擬多實例隔離key本身不允許包含反斜杠trim、checkContentChanged為空操作encrypt/decrypt/recrypt不可用。因此跨端項目若為持久化實例配置了encryptionKey在 Web 端構(gòu)建時會失敗需要按平臺條件化傳參。測試環(huán)境。createMMKV在 jest 下返回內(nèi)存 mockcreateMMKV.ts#L11-L14配合倉庫中的 mock 模塊mocks/react-native-nitro-modules.js你可以在單測中直接斷言reduxStorage.getItem/setItem的存取一致性而無需 mock 原生層。小結(jié)react-native-mmkv 與 redux-persist 的集成路徑非常短createMMKV()拿到同步實例用三個一行式方法包成Storage對象交給persistStore即可。官方文檔 docs/WRAPPER_REDUX.md 只給出了最小封裝而真正的工程價值在于利用Configuration把持久化實例從默認命名空間中隔離出來獨立id、按需加密encryptionKeyencryptionType并用compareBeforeSet抑制重復寫盤。所有相關實現(xiàn)均可在 packages/react-native-mmkv/src 下按本文給出的路徑逐一核對。贊分享【免費下載鏈接】react-native-mmkv?? The fastest key/value storage for React Native. ~30x faster than AsyncStorage!項目地址https://gitcode.com/gh_mirrors/re/react-native-mmkv點擊查看免費下載相關推薦Redux-Thunk與Redux-Persist異步狀態(tài)持久化Redux Thunk與Redux Persist異步狀態(tài)持久化 你是否在開發(fā)React應用時遇到過這樣的問題頁面刷新后Redux存儲的用戶登錄狀態(tài)消失了前端PDF補丁丁3個核心功能幫你徹底解決PDF編輯難題PDF補丁丁3個核心功能幫你徹底解決PDF編輯難題 你是否曾經(jīng)為PDF文檔的書簽編輯而頭疼是否因為無法批量處理多個PDF文件而加班到深夜PDF補丁丁作為一桌面應用文檔ServerEngine Supervisor機制揭秘確保服務器24/7不間斷運行的終極指南 ServerEngine Supervisor機制揭秘確保服務器24/7不間斷運行的終極指南 ServerEngine Supervisor機制是構(gòu)建后端上一篇抖音視頻批量下載終極指南douyin-downloader讓內(nèi)容創(chuàng)作效率提升300%下一篇5分鐘快速部署Python微信機器人WechatBot終極指南創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考