重要的
react-native-mmkv V3 现在是纯 C++ TurboModule,需要启用新架构。 (反应本机 0.75+)
StorageBenchmark 通过从存储中读取值 1000 次来比较流行的存储库:
MMKV 与其他存储库:从存储中读取值 1000 次。
在 iPhone 11 Pro 上以毫秒为单位,越低越好。
yarn add react-native-mmkv
cd ios && pod install
npx expo install react-native-mmkv
npx expo prebuild
要创建 MMKV 存储的新实例,请使用MMKV
构造函数。建议您在整个应用程序中重复使用此实例,而不是每次都创建一个新实例,因此export
storage
对象。
import { MMKV } from 'react-native-mmkv'
export const storage = new MMKV ( )
这将使用默认 MMKV 存储 ID ( mmkv.default
) 创建一个新的存储实例。
如果您想要在您的应用与同一组中的其他应用或应用扩展之间共享 MMKV 数据,请打开Info.plist
并使用您的应用组的值创建一个AppGroup
键。然后,MMKV 将自动将数据存储在应用程序组内,通过利用 MMKV 的多处理模式,可以从同一组中的其他应用程序或应用程序扩展读取和写入数据。请参阅配置应用程序组。
import { MMKV , Mode } from 'react-native-mmkv'
export const storage = new MMKV ( {
id : `user- ${ userId } -storage` ,
path : ` ${ USER_DIRECTORY } /storage` ,
encryptionKey : 'hunter2' ,
mode : Mode . MULTI_PROCESS ,
readOnly : false
} )
这将使用自定义 MMKV 存储 ID 创建一个新的存储实例。通过使用自定义存储 ID,您的存储与应用程序的默认 MMKV 存储分开。
可以配置以下值:
id
:MMKV 实例的 ID。如果要使用多个实例,请使用不同的 ID。例如,您可以分离全局应用程序的存储和登录用户的存储。 (如果指定了path
或encryptionKey
字段,则为必需,否则默认为: 'mmkv.default'
)path
:MMKV 实例的根路径。默认情况下,MMKV 将文件存储在$(Documents)/mmkv/
内。您可以在MMKV初始化时自定义MMKV的根目录(文档:iOS / Android)encryptionKey
:MMKV 实例的加密/解密密钥。默认情况下,MMKV 将所有键值以纯文本形式存储在文件中,依靠 iOS/Android 的沙箱来确保文件加密。如果您担心信息泄露,可以选择加密MMKV。 (文档:iOS/Android)mode
:MMKV 的进程行为 - 当设置为MULTI_PROCESS
时,MMKV 实例将假定可以从外部更改数据(例如应用程序剪辑、扩展或应用程序组)。readOnly
:此 MMKV 实例是否应处于只读模式。这通常更有效,并且可以避免不必要的数据写入(如果不需要)。任何对set(..)
调用都会抛出异常。 storage . set ( 'user.name' , 'Marc' )
storage . set ( 'user.age' , 21 )
storage . set ( 'is-mmkv-fast-asf' , true )
const username = storage . getString ( 'user.name' ) // 'Marc'
const age = storage . getNumber ( 'user.age' ) // 21
const isMmkvFastAsf = storage . getBoolean ( 'is-mmkv-fast-asf' ) // true
const [ username , setUsername ] = useMMKVString ( 'user.name' )
const [ age , setAge ] = useMMKVNumber ( 'user.age' )
const [ isMmkvFastAsf , setIsMmkvFastAf ] = useMMKVBoolean ( 'is-mmkv-fast-asf' )
// checking if a specific key exists
const hasUsername = storage . contains ( 'user.name' )
// getting all keys
const keys = storage . getAllKeys ( ) // ['user.name', 'user.age', 'is-mmkv-fast-asf']
// delete a specific key + value
storage . delete ( 'user.name' )
// delete all keys
storage . clearAll ( )
const user = {
username : 'Marc' ,
age : 21
}
// Serialize the object into a JSON string
storage . set ( 'user' , JSON . stringify ( user ) )
// Deserialize the JSON string into an object
const jsonUser = storage . getString ( 'user' ) // { 'username': 'Marc', 'age': 21 }
const userObject = JSON . parse ( jsonUser )
// encrypt all data with a private key
storage . recrypt ( 'hunter2' )
// remove encryption
storage . recrypt ( undefined )
const buffer = new ArrayBuffer ( 3 )
const dataWriter = new Uint8Array ( buffer )
dataWriter [ 0 ] = 1
dataWriter [ 1 ] = 100
dataWriter [ 2 ] = 255
storage . set ( 'someToken' , buffer )
const buffer = storage . getBuffer ( 'someToken' )
console . log ( buffer ) // [1, 100, 255]
// get size of MMKV storage in bytes
const size = storage . size
if ( size >= 4096 ) {
// clean unused keys and clear memory cache
storage . trim ( )
}
使用 Jest 或 Vitest 进行测试时,会自动使用模拟的 MMKV 实例,因此您将能够在测试中正常使用new MMKV()
。有关使用 Jest 的示例,请参阅 package/example/test/MMKV.test.ts。
如果用户选择在浏览器中禁用 LocalStorage,该库将自动提供有限的内存存储作为替代方案。但是,这种内存存储不会持久保存数据,如果用户刷新页面或关闭浏览器,可能会遇到数据丢失的情况。为了优化用户体验,请考虑在您的应用程序中实施合适的解决方案来解决这种情况。
使用 Flipper-plugin-react-native-mmkv 来调试使用 Flipper 的 MMKV 存储。您还可以简单地console.log
MMKV 实例。
使用 Reactotron-react-native-mmkv 自动记录对 MMKV 存储的写入。有关如何使用 Reactotron 设置此插件的信息,请参阅文档。
加入 Margelo 社区 Discord来讨论 react-native-mmkv 或其他 Margelo 库。
React-native-mmkv按原样提供,我在空闲时间研究它。
如果您要在生产应用程序中集成react-native-mmkv,请考虑资助该项目并联系我以获得高级企业支持、帮助解决问题、优先修复错误、请求功能、帮助集成react-native-mmkv等等。
请参阅贡献指南,了解如何为存储库和开发工作流程做出贡献。
麻省理工学院