qwerty-learner 本地词库与练习记录从 JSON 词库文件到 IndexedDB 索引的设计【免费下载链接】qwerty-learner为键盘工作者设计的单词记忆与英语肌肉记忆锻炼软件 / Words learning and English muscle memory training software designed for keyboard workers项目地址: https://gitcode.com/GitHub_Trending/qw/qwerty-learnerqwerty-learner 是一款在键盘上练习英语肌肉记忆的单词训练工具。本文解析它的本地词库存储机制200 多个 JSON 词库文件如何被加载与分片IndexedDB 里的练习记录如何建索引以及错误单词、打字速度的统计口径是怎么算出来的。词库数据从哪来词库 JSON 文件的统一结构所有词库都以 JSON 形式放在 public/dicts/ 目录下从小学到 GRE、雅思、考研还有日语、德语、印尼语等多语言词库。每个词库就是一组单词数组单词结构统一为四个字段name单词trans释义数组usphone/ukphone美音、英式音标以 CET4_T.json 为例单词 cancel 就带着释义取消撤销删去和音标。正因为结构固定任何一份文件丢进目录就能被程序直接消费这也是文档里鼓励贡献词库的原因。词库选择界面本地 JSON 词库按级别分类展示词库如何被加载与分片前端通过 wordListFetcher 用fetch把词库 JSON 拉回来并解析成单词数组再交给 SWR 做内存缓存——同一个词库切换页面不会重复请求。大词库按章节切分练习界面一次只加载当前章节配合章节组件做懒加载避免一次性把几万个单词铺进内存。由于词库文件与页面同源部署断网后浏览器也能直接读缓存词库部分天然支持离线。练习记录写入 IndexedDB 的方式三张记录表和索引怎么建词库本身不写数据库写进 IndexedDB 的是你打了什么。项目用 DexieIndexedDB 的封装在 src/utils/db 定义了名为RecordDB的库包含三张表wordRecords每个单词的一次练习记录chapterRecords每轮章节练习的汇总reviewRecords错题复习的进度表的索引定义只有一行却决定了后面所有查询的快慢this.version(2).stores({ wordRecords: id,word,timeStamp,dict,chapter,wrongCount,[dictchapter], chapterRecords: id,timeStamp,dict,chapter,time,[dictchapter], })每个单词、词库 ID、时间戳、错误次数都单独建索引另外加了[dictchapter]复合索引。查询某词库某章节的全部记录走复合索引查询某时间段的全部记录走timeStamp范围查询查询打错过几次的单词走wrongCount索引。索引是提前为最常用查询准备的。一条单词记录里存了什么每次打完一个单词WordRecord 会记下word与dict、chapter哪个词库的哪个词timing正确输入时每个字母的耗时差数组加起来就是总用时wrongCount出错的次数输错会清空重打但只记一次错误mistakes第几个字母位置被错打成了哪个键mistakes这个字段是后面哪个按键最容易按错分析的数据来源。章节级的ChapterRecord则额外保存正确/错误按键总数和未出错的单词下标打字速度wpm、按键正确率、单词正确率都写成 getter 现算不落库。练习完成后逐词记录与章节汇总分别写入 wordRecords 和 chapterRecords统计与错误单词是怎么算出来的错误单词的统计口径错题页的 useErrorWords 先按索引取出这个词库里错过的单词db.wordRecords .where(wrongCount) .above(0) .filter((record) record.dict dict.id) .toArray()wrongCount索引先过滤掉所有零错误的记录再在内存里按word分组累加。每个错误单词最终得出四个指标累计错误次数errorCount、按字母位置统计的易错点errorLetters、最近一次出错时间latestErrorTime以及把这两个维度排名后按 0.6 / 0.4 加权得到的复习顺序——错误越多、错得越近的单词排在越前面复习列表就按这个顺序生成并写入reviewRecords。速度、正确率与热力图的口径分析页的 useWordStats 用timeStamp索引做区间查询把一段时间的记录按天聚合练习次数、去重后单词数 → 生成活动热力图wpm 当日练习词数不去重÷ 总用时 × 60正确率 单词字母总长 ÷字母总长 错误次数× 100%按错的键归并成大写字母 → 输出哪个键最常按错的柱状图每日 wpm 折线图数据来自 wordRecords 中 timing 字段的按天聚合边界与取舍为什么全放本地而不是上服务器学习记录打了什么、错在哪本质是个人数据放在浏览器本地 IndexedDB 里意味着隐私不出机器、离线可用、零后端成本。代价是没有跨设备同步项目给出的解法是手动迁移data-export 把整个库导出、gzip 压缩成Qwerty-Learner-User-Data-日期.gz文件导入时解压回灌换设备靠这一个文件。数据库版本演进与什么不入库RecordDB从 version 1 一路升到 version 3字段从errorCount改名到wrongCount、新增了reviewRecords表Dexie 的 version 机制负责平滑迁移老用户的数据。另一条边界值得注意词库 JSON 永远不进 IndexedDB库里只存练习行为。这样做的好处是词库更新比如新加了释义不需要迁移用户数据代价是错题页要展示释义时仍需用词库文件把word名字反查回完整词条。整体来看这套静态词库走文件 动态记录走 IndexedDB 文件导入导出兜底的组合是一个纯前端项目在隐私、离线和复杂度之间比较克制的选择。这套解析对想给前端小工具加本地持久层的开发者有参考价值先用统一 JSON 结构组织静态数据再按最常用查询设计 IndexedDB 索引最后用文件导入导出替代账号同步三步就能搭出一个离线可用的本地词库与练习记录系统。【免费下载链接】qwerty-learner为键盘工作者设计的单词记忆与英语肌肉记忆锻炼软件 / Words learning and English muscle memory training software designed for keyboard workers项目地址: https://gitcode.com/GitHub_Trending/qw/qwerty-learner创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考