尧图精选

BloomRPC状态持久化实现解析:基于electron-store的标签页与请求保存机制

🕒 发布时间:2026/9/19 23:06:12 📁 来源:尧图网络
BloomRPC状态持久化实现解析基于electron-store的标签页与请求保存机制【免费下载链接】bloomrpcFormer GUI client for gRPC services. No longer maintained.项目地址: https://gitcode.com/gh_mirrors/bl/bloomrpcBloomRPC 是一款经典的 gRPC GUI 客户端它的状态持久化机制基于 electron-store 实现每次你打开标签页、编辑请求参数数据都会自动保存到本地 JSON 文件下次启动应用时无缝还原。本文将带你解析这套标签页与请求保存机制的完整实现思路。先认识一下 BloomRPCBloomRPC 灵感来自 Postman 和 GraphQL Playground定位为最简单的 gRPC 服务探索与调用工具。导入.proto文件后左侧显示服务与方法树点击方法即可在右侧标签页中编辑请求并发送。项目目前已归档但其 app/storage/ 目录下的持久化设计依然值得学习——它用不到 200 行代码就实现了标签页、请求参数、导入路径、TLS 证书四类数据的完整持久化。持久化总体架构4 个独立的 electron-store 实例BloomRPC 的持久化层集中在 app/storage/ 目录每类数据对应一个独立的 electron-store 实例各自生成一个 JSON 文件存储模块store 名称保存的数据editor.tseditor服务器地址、proto 列表、标签页、请求详情importPaths.tsimportPathsproto 依赖导入路径tls.tstlsTLS 证书配置environments.tsenvironments多环境dev/staging 等配置electron-store 的工作方式非常朴素它把数据写到 Electron 的userData目录下的 JSON 文件如editor.json每次set时原子化写盘读取时解析整个文件。对桌面应用来说这是最稳妥也最简单的状态持久化方案。统一入口 storage/index.ts 还导出了一个clearAll()方法一次性清空上述三类存储——它被菜单中的 Clear Storage 快捷键CtrlCommandD调用方便用户一键重置。标签页保存机制只存坐标不存内容标签页持久化的核心在 app/storage/editor.ts 的storeTabs函数。它的设计亮点是只保存定位标签所需的最小字段protoPathproto 文件的绝对路径serviceName服务名methodName方法名tabKey标签唯一标识activeKey当前激活的标签而不是把整个 React 组件状态序列化下来。这样文件体积小且重启后只需重新解析 proto 文件再按坐标找回对应的 service 对象即可。标签页的写入时机由 BloomRPC.tsx 中包装过的setTabs统一触发——任何改变标签的操作选中方法、拖动排序、关闭标签都会同步落盘单击方法tabKey由服务名方法名拼成L243-L268天然去重双击方法额外拼一个 UUID 后缀L271-L287允许多个相同方法的标签并存拖动排序通过arrayMove重排后整体保存。请求保存机制以 tabKey 为主键的覆盖式更新每个标签页里的请求细节服务器 URL、请求体、metadata、gRPC-Web 开关、TLS 证书等由 editor.ts 的storeRequestInfo负责保存它采用以tabKey为主键的覆盖式更新策略取出requests数组过滤掉同id的旧记录追加一条新记录附带createdAt时间戳整体写回 store。这相当于用数组模拟了一张键值表同一标签反复编辑只会保留最新一条。对应的读取与删除函数getRequestInfoL129-L132和deleteRequestInfoL138-L143也围绕同一个主键工作。触发链路是Editor.tsx 中任何请求字段的变更 → 通过onRequestChange冒泡到 TabList.tsx在这里把tabKey作为id附加上去再交给storeRequestInfo落盘。启动还原hydrateEditor 三步走数据存下来只是上半场BloomRPC 的还原逻辑 hydrateEditor 在组件挂载时useEffect被调用流程分三步读 proto 列表getProtos()拿到上次保存的 proto 文件路径调用loadProtos重新解析顺便带上importPaths里保存的依赖目录重建标签getTabs()拿到标签坐标loadTabs 把每个tabKey映射回真实的 service 对象找不到对应定义比如 proto 文件被删了的标签会被静默丢弃回填请求内容每个标签通过getRequestInfo(tabKey)取回initialRequest交给 Editor 作为初始状态渲染。整个过程用Promise.all并发执行并在loadTabs失败时回退到空白标签页L153-L158保证即使本地数据损坏应用也能正常启动。侧边栏的 Reload 按钮同样复用这套逻辑方便手动重新水合。数据存储位置与手动清理存储位置所有数据都是 ElectronuserData目录下的纯 JSON 文件editor.json、tls.json等可以直接用文本编辑器查看修改。清空方式macOS 菜单 Edit → Clear StorageCtrlCommandD或程序内调用 clearAll。容错设计getTLSList等在读取时都提供了合理的默认值tls.ts首次使用或文件缺失时不会报错。小结3 个可复用的持久化设计点 按数据域拆分 store标签、请求、证书各用一个 electron-store 实例互不干扰清理与迁移都简单存坐标而非内容标签页只存文件路径服务名方法名重启时重新加载数据源天然抗数据腐化主键覆盖式更新请求数据以tabKey为主键做过滤追加逻辑清晰且避免了数组无限膨胀。这套机制没有引入任何本地数据库却让 BloomRPC 的关窗口再打开、现场还在的体验非常可靠是小型 Electron 应用做状态持久化的优秀参考。【免费下载链接】bloomrpcFormer GUI client for gRPC services. No longer maintained.项目地址: https://gitcode.com/gh_mirrors/bl/bloomrpc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →