380 个词库全部存在本地:Qwerty Learner 如何完成词库加载与学习数据索引
【免费下载链接】qwerty-learner为键盘工作者设计的单词记忆与英语肌肉记忆锻炼软件 / Words learning and English muscle memory training software designed for keyboard workers项目地址: https://gitcode.com/GitHub_Trending/qw/qwerty-learner
Qwerty Learner 是一款面向键盘工作者的单词记忆与打字肌肉记忆训练工具,380 个本地词库和全部学习记录都保存在浏览器中,不依赖服务器。本文按数据流动的路径讲清词库文件从哪加载、如何按 20 词一章切分、IndexedDB 本地数据库里记了什么、索引查询如何加速统计,读完你可以照格式添加自己的词库。
📁 词库文件在哪,怎么被加载
词库本体是public/dicts/目录下的 380 个 JSON 文件,覆盖四级、考研、雅思、GRE,以及日语、德语等语言词库。每个文件是统一结构的数组:单词名、释义数组、英美音标,部分词库(如编程语言词汇)只含释义不含音标。
词库不是散落的文件列表,而是在 src/resources/dictionary.ts 中逐条登记:id、name、category、url、length。加载时由wordListFetcher对这个url执行fetch并解析 JSON,结果经 SWR 按词库地址做键缓存,同一词库切回时不再重复解析。
[ { "name": "cancel", "trans": ["取消, 撤销; 删去"], "usphone": "'kænsl", "ukphone": "'kænsl" }, { "name": "explosive", "trans": ["爆炸的; 极易引起争论的", "炸药"], "usphone": "ɪk'splosɪv", "ukphone": "ɪk'spləusɪv" } ]词库选择界面,本地词库按类别分组展示
380 个词库会一次全部加载吗
不会。加载粒度是词库,渲染粒度是章节。src/constants/index.ts里CHAPTER_LENGTH = 20,useWordList拿到整份 JSON 后只做切片:slice(chapter * 20, (chapter + 1) * 20),界面任何时刻只渲染当前章节的 20 个单词。机制带来的效果是:章节切换即时完成,长词库(如 2607 词的四级词库,约 131 章)不会拖慢首屏。
| 机制项 | 取值 | 位置 |
|---|---|---|
| 每章单词数 | 20 | src/constants/index.ts的CHAPTER_LENGTH |
| 词库缓存 | 以词库 url 为键,SWR 内存缓存 | src/pages/Typing/hooks/useWordList.ts |
| 章节总数 | 词数按 20 个一组向上取整 | src/utils/index.ts的calcChapterCount |
🗃️ 学习记录存在哪
练习数据不进文件系统,而是写入浏览器内的 IndexedDB 本地数据库,数据库名RecordDB,通过 Dexie 封装,声明见 src/utils/db/。其中三张核心表:
wordRecords:每打完一个词写一条,字段包括word、timeStamp、dict、chapter、timing(每个字母的输入耗时差数组)、wrongCount(错误次数)、mistakes(每个字母位置被误按成了哪些键)。chapterRecords:每章结束写一条,记录用时(秒)、正确/错误按键数、correctWordIndexes(一次打对的单词下标),并由此算出wpm(每分钟词数)、按键准确率与单词准确率。reviewRecords:复习任务,保存复习词表、进度index与完成标记。
写入由 Hook 触发:useSaveWordRecord在单词完成时落库,useSaveChapterRecord在章节结束后落库。
| 表名 | 记录内容 | 写入时机 |
|---|---|---|
| wordRecords | 单词、耗时、错误次数、误按按键 | 每打完一个词 |
| chapterRecords | 用时、正误按键数、wpm | 章节练习结束 |
| reviewRecords | 复习词表、进度、完成状态 | 创建复习任务时 |
索引查询如何加速查找
加速不靠额外服务,靠索引声明。Dexie 在版本配置里为每张表声明了多个索引:
wordRecords: '++id,word,timeStamp,dict,chapter,wrongCount,[dict+chapter]' chapterRecords: '++id,timeStamp,dict,chapter,time,[dict+chapter]' reviewRecords: '++id,dict,createTime,isFinished'每条声明对应一类典型查询:timeStamp是范围索引,分析页的useWordStats直接用它做区间扫描,把时间段内的单词记录一次性取出,再汇总出打字速度、准确率和热力图数据;[dict+chapter]复合索引让错题本可以按「词库 + 章节」精确定位;word索引则支撑按词删除记录。查询命中索引而非全表遍历,是数据量大后统计页仍然流畅的原因。
📶 断网能用吗
可以,前提区分两类数据:
- 学习记录。全部在 IndexedDB 本地数据库读写,从写入到查询都不经过网络,离线场景下离线背单词、查错词、看统计完全可用。
- 词库文件。作为静态资源与页面同源分发,首次加载后进入浏览器 HTTP 缓存;缓存命中后重新请求 JSON 无需网络。
Dockerfile与docker-compose.yaml也说明项目支持自部署到内网,配合本地数据实现全程无外网。
相关资源目录:public/dicts/(词库静态文件)、Dockerfile(自部署镜像定义)。
如何添加自己的词库
流程写明了两件事:文件格式与登记位置。文件格式是一个 JSON 数组,元素至少含name与trans两个字段,可选音标;文件放到public/dicts/下后,再在src/resources/dictionary.ts中登记id、url、length等元信息,词库即出现在选择界面中对应分类下。完整步骤与示例见 docs/toBuildDict.md,社区也接受以「Dictionary Request」开头的词典需求。
【免费下载链接】qwerty-learner为键盘工作者设计的单词记忆与英语肌肉记忆锻炼软件 / Words learning and English muscle memory training software designed for keyboard workers项目地址: https://gitcode.com/GitHub_Trending/qw/qwerty-learner
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考