图标数据存在哪?better-icons本地存储与原子写入安全设计分析

📅 发布时间:2026/10/13 2:34:05
图标数据存在哪?better-icons本地存储与原子写入安全设计分析
【免费下载链接】better-iconsSkill and MCP server for searching and retrieving icons项目地址https://gitcode.com/gh_mirrors/be/better-icons点击查看免费下载better-icons 是一款面向 AI 编程助手的图标检索工具可以搜索并获取 Iconify 提供的 20 万 图标150 图标库支持 MCP Server 和 CLI 两种使用方式。很多人都会问**图标数据到底存在哪里**本文带你彻底搞懂它的本地存储机制以及为什么它的原子写入设计能有效防止偏好数据损坏。先搞清楚图标本体根本不落在本地这是理解 better-icons 存储设计的关键前提图标 SVG 数据不缓存到本地磁盘。每次调用search_icons、get_icon等工具时服务器都会实时请求 Iconify 在线接口获取图标数据API 地址定义在 constants.ts 中本地磁盘上真正落盘的只有两类小文件用户偏好记录、Agent 的 MCP 配置再加上你项目里的图标组件文件。这种数据云端取、偏好本地记的架构让安装包保持轻量也避免了本地缓存过期问题。本地存储全景三类文件的存放位置better-icons 在本地一共涉及三处写入各自的归属地各不相同存储内容存放位置说明使用偏好与历史~/.better-icons/preferences.json全局唯一跨项目共享MCP 配置文件各 Agent 的配置目录如~/.cursor/mcp.json、~/.claude/settings.json由 setup 命令生成图标组件文件你的项目内如icons.tsx由 sync_icon 工具追加写入1️⃣ 偏好文件~/.better-icons/preferences.json这是整个项目中最核心的本地数据。偏好文件的路径由 memory.ts 中的getPreferencesPath函数生成固定位于用户主目录下的.better-icons目录。文件内容是一个标准 JSON包含两部分结构定义见 memory.tscollections记录每个图标集合如mdi、lucide的使用次数和最近使用时间用于实现自动学习——搜索结果的排序会优先你常用的集合这个排序逻辑在 server.ts 中生效history最近使用的图标历史由MAX_HISTORY_SIZE 50控制上限只保留最近 50 条memory.ts所以这个文件永远不会膨胀。2️⃣ MCP 配置随 Agent 而变运行better-icons setup后安装向导会按所选的 Agent 和范围全局/项目写入对应的 MCP 配置。各 Agent 的配置路径统一定义在 agents.ts实际读写由 utils.ts 的readJsonFile/writeJsonFile完成——写入前会先检查目录是否存在不存在则自动创建避免目录缺失导致写入失败这类低级问题。3️⃣ 项目图标文件写入你自己的代码库sync_icon工具会把图标生成为 React/Vue/Svelte/Solid 组件代码直接追加到你指定的图标文件里。这套逻辑在 project-sync.ts 中写入前先通过parseExistingIcons解析文件里已有的图标project-sync.ts如果同名图标已存在就跳过保证重复同步不会产生重复代码新文件还会带上Auto-generated icons file的头部注释提示这是自动生成文件。核心亮点原子写入如何防止数据损坏偏好文件每次取用图标时都会被更新trackUsage会读、改、写一次 JSON。这里存在一个经典风险如果写入过程中程序崩溃或两个进程同时写入文件可能被写一半而损坏。一旦偏好文件损坏自动学习功能就废了。better-icons 在 memory.ts 的savePreferences中用了一套教科书级的**原子写入Atomic Write**方案先写临时文件新内容不直接写入preferences.json而是写入同目录下的临时文件文件名带上进程 ID 后缀preferences.json.pid.tmp确保多个进程互不干扰再原子重命名临时文件写完后用renameSync将其改名为正式文件名。在同一文件系统内rename 是操作系统保证的原子操作——结果要么是旧文件、要么是新文件绝不会出现写了一半的中间状态失败兜底如果 rename 失败代码会尝试直接写正式文件作为降级手段并保留原始错误继续抛出memory.ts。读取端同样做了防御数据损坏往往来自读到坏文件。loadPreferences的读取逻辑memory.ts做了三层保护文件不存在 → 返回默认空偏好不报错JSON 解析失败文件损坏→ 同样静默降级为默认值下次写入时会被完整重建字段缺失 → 用||补全collections和history容忍旧版本格式。写入端的重试机制trackUsage在记录用量时还套了一层最多 3 次的重试循环memory.ts应对并发访问导致的偶发写入失败即便 3 次都失败也只是打印一条错误日志而不会让主流程崩溃——因为记录偏好属于锦上添花不能因为它失败就影响用户取图标。如何查看和管理这些本地数据查看学习到的偏好在 AI 助手里调用get_icon_preferences会列出各集合的使用次数和最近使用时间查看最近图标get_recent_icons从本地历史中读取最近 50 条内的记录重置一切调用clear_icon_preferences它会用空偏好覆盖写回文件memory.ts走的是同一套原子写入流程手动查看直接打开~/.better-icons/preferences.json就是一个可读性很好的格式化 JSON想彻底清空偏好删除该目录即可下次运行会自动重建。小结一个务实的存储设计范本回顾 better-icons 的本地存储方案可以提炼出几个值得借鉴的设计取舍不缓存大数据——图标本体走在线 API本地只存轻量偏好架构简单且无缓存一致性问题原子写入 重试 静默降级——三层防线保证小文件的持久化安全任何一步失败都不影响主功能有界的历史记录——50 条上限让文件体积可控无需额外的清理逻辑幂等的代码文件同步——写前先解析、存在即跳过重复操作不会污染你的代码库。对于任何需要本地持久化用户偏好的 CLI 工具或 Agent 插件来说memory.ts 这份不到 140 行的实现就是一个非常值得参考的小而稳的设计样本。赞分享【免费下载链接】better-iconsSkill and MCP server for searching and retrieving icons项目地址https://gitcode.com/gh_mirrors/be/better-icons点击查看免费下载相关推荐Cherry Studio存储架构本地数据库设计原理与数据管理完整指南Cherry Studio存储架构本地数据库设计原理与数据管理完整指南 Cherry Studio作为一款支持多LLM提供商的桌面客户端其强大的本地数据库架AI 应用大模型桌面应用本地部署RAGKopf快速入门5分钟内创建你的第一个Kubernetes OperatorKopf快速入门5分钟内创建你的第一个Kubernetes Operator Kopf是一个Python框架能让你用短短几行代码编写Kubernetes O后端CMS前端3大核心技术革新Bloxstrap如何重新定义Roblox启动器体验3大核心技术革新Bloxstrap如何重新定义Roblox启动器体验 在开源游戏工具领域Bloxstrap作为一款功能丰富的Roblox启动器替代方案通过创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考