@facilitronworks/ react-native-windows-sync-kv (英语)
同步、 有持久性的密钥/ 值存储, 用于 React Endern Windows 在新架构(Fabric / Constitution)上——存储原始的RNW没有.
状况:释放前
0.1.0-pre.1) (中文(简体) ). C++的实现取自一款货运出品的Windows应用软件(RNW 0.83.2,Windows-on-ARM和x64),它是四个独立的JS软件包背后的存储引擎". Windows shims (英语).这里所证实的是: 见 核查状况. 阅读它之前取决于这个.
为什么会这样
反应原生窗口船 没有同步,JS可访问的持久商店不是一个缓慢的,一个也没有。 每个选项要么同步要么缺失:
| 软件包 | 窗口状态 |
|---|---|
@react-native-async-storage/async-storage | 顾名思义—— await 每个读取. |
react-native-mmkv 页:1 | 硝基/内生; 无窗口构建。使 MMKV 值值的同步 API 不可用. |
react-native-encrypted-storage | 没有 Windows 执行 . |
expo-secure-store | 没有 Windows 执行 . |
缝隙最深 离线第一应用程序MMKV编程模式 - const token = storage.getString('token') 返回一个 价值 在模块装入时间,而不是一个承诺——就是让屏幕在第一幅油漆上充电,而不是在后期闪出并填入一勾。 移植到Windows上,这个代码不仅运行得更慢;它不会运行.
此模块提供缺失的原始: a REACT_SYNC_METHOD- 基于商店 阻断JS线 微秒 并手拿回值.
在从应用程序中提取的,这个单一的本地模块背起Windows shims用于 全部四个 上方的软件包——每个软件包都将其密钥放入同一个商店.
如何运作
- 从JSON取出一个水分
ApplicationData.LocalFolder\SyncKV.json变成记忆std::unordered_map一次,懒惰地,在第一次访问(mirroring MMKV的mmap-hydrate-once模型)时,通过同步std::ifstream。 。 。 . - 服务从地图上读取和书写 零声速.
- 跳出( 300 ms squiet phile) 写到背景线上
.tmp财务报告和审定财务报表MoveFileExW(..., MOVEFILE_REPLACE_EXISTING)——"杀" 中写只能腐蚀临时文件,从不真实. clearAll()冲出 同步,所以登出/清洗 立即持久.
此编码的终身陷阱
这是值得阅读的部分 即使你写自己的.
创建并销毁反应模块实例 每个反应实例 每个地铁都重新装入了你的眼泪 明显的设计(地图、变种、条件变量作为实例成员;脱开的工人线条捕捉) this)在重新装入时产生无用后:孤儿工人不断读写被放出的例子. 它以随机的赫尔墨斯访问违规和故障快克的形式,在三个截然不同的崩溃签名中呈现出来,并且越来越糟糕的是,存储的数据越多——即它看起来除了一个终生错误之外什么也一样.
这个舱载的固定装置: 所有可变状态都生活在故意被泄露的流程-寿命单子中,而且每个过程都存在一个精确的工人线程,无论React实例重载了多少次. 一个被泄露的单子无法缠绕;操作系统会在过程死亡时将其还原.
在此编码的其他约束
- RNW 同步方法无法返回
void—— 说ModuleSyncMethodInfo需要一个TResult。这就是为什么set编号 :remove编号 :clearAll返回时bool。 。 。 . - 每个方法都是
noexcept根据同步方法合同,所以 每一个分配体是try- 包装A级bad_alloc逃脱anoexcept函数快速失败进程,而多MB值使该程序可以达到. - 书写保持同步( 不)
REACT_METHOD具体地说set()紧接着是getString()观察新的价值.
安装
npm install @facilitronworks/react-native-windows-sync-kv
# or: yarn add @facilitronworks/react-native-windows-sync-kv
然后自动连接和重建:
npx react-native autolink-windows
npx react-native run-windows
自动链接源代码 #include <winrt/RNWSyncKv.h> 财务报告和审定财务报表 packageProviders.Append(winrt::RNWSyncKv::ReactPackageProvider()) 从 <RootNamespace> 输入 .vcxproj。 。 。 . 大都会重载将无法取回一个新的本土模块——你必须重建.
没有 WinMain 需要接线: 此模块没有主机窗口依赖性 .
使用量
import {
getString, set, remove, contains, getAllKeys, clearAll, createStore,
} from '@facilitronworks/react-native-windows-sync-kv';
set('token', 'abc');
getString('token'); // 'abc' — a value, not a promise
contains('token'); // true
getAllKeys(); // ['token']
remove('token');
clearAll(); // wipes everything, flushes synchronously
命名空间商店, 当多个逻辑商店共享一个本地块时 :
const prefs = createStore('prefs');
prefs.set('darkMode', true);
prefs.getBoolean('darkMode'); // true
prefs.getString('missing'); // undefined (not '')
prefs.clearAll(); // only clears the 'prefs.' namespace
注意故意的区别: 平地 getString() 返回时 '' 丢失的密钥(原始本地合同) createStore(...).getString() 返回时 undefined,匹配反应-内生-mmkv表面.
闪出另一个软件包
典型的用途是 .windows.ts 平台扩展,将另一个软件包的API再导出到此商店上方,例如用于 react-native-mmkv数字 :
// mmkvStorage.windows.ts
import { createStore } from '@facilitronworks/react-native-windows-sync-kv';
export const storage = createStore('mmkv');
你会撞上陷阱
- 值为字符串. 将其它东西按顺序排列
createStore强迫布尔和数字通过String()并剖析他们。 上盘格式是字符串=字符串的平坦的JSON对象;在水合物上跳过手版文件中的非字符串JSON值. getString()无法区分“ missing”和“ missing”''。 。 。 . 使用contains()-或者说createStore这对你有好处.- 这堵住了JS线条. 每把按键存储兆字节,在渲染道上读取它们就会被显示为相克. 这是一个偏好/会话商店,不是数据库.
- 未加密 .
LocalFolder\SyncKV.json在磁盘上是普通的JSON。 闪电expo-secure-store或者说react-native-encrypted-storage在它给你 API 密码,而不是他们的 安全保证。在此不添加加密(例如 DPAPI) . - 该商店是全流程的,没有分割. 两个图书馆选择相同的密钥相撞. 通过命名空间
createStore。 。 。 . - 从源头建楼需要先恢复 NuGet (单位:千美元)
msbuild -restore) (中文(简体) ). 没有它,CppWinRT目标 从来没有加载,.idl文件流经经典midl.exe改为midlrt和每个namespace声明失败MIDL2025。 。 。 .
核查状况
已验证,在这个精确的包装来源上:
- 被包装的窗体编译. 通过 a 自动链接
portal:依赖消费的RNW 0.83.2 新成品应用,并为 ARM64 调试,生产RNWSyncKv.dll, (中文(简体) ),RNWSyncKv.winmd财务报告和审定财务报表RNWSyncKv.lib。 。 。 . autolink-windows解析软件包并同时发送包含和ReactPackageProvider登记.
未核实 - 不假定其中任何一项:
- DLL 的运行时行为 这个 项目. 来源是生产-在它的原应用中被证实,但此回波所生产的二进制没有在设备上被执行:没有进行读取/写入/持久性/再装入测试.
- x64, Win32, 和发行 配置 只有ARM64调试器建成.
- 这个
src/index.tsJS层是这个套件的新款 并且没有从生产应用中被取出(它通过自己的每包shims称为"原生模块"). 输入检查; 尚未运行 . - 没有实例应用,没有自动化测试,没有CI.
- 同一应用程序共享一个多个进程/程序下的行为
LocalFolder是未定义和未经检验的——最多最后一位作家获胜.
更改日志
- 0.1.0-前1节 ——后置存储文件现在
SyncKV.json(曾经是)RNWSyncKv.json),因此采用现有SyncKV.json; 供从树上模块迁移的消费者使用. - 0.1.0 - 预0 ——初步预发.
许可证
麻省理工学院