用间隔重复算法做一个碎片时间背卡工具:从设计到发布的实践记录

举报
yd_221565968 发表于 2026/11/11 19:40:05 2026/11/11
【摘要】 记录用简化版间隔重复算法实现纯前端闪卡复习工具“碎片背卡”的过程,包括功能设计、调度规则、实现细节,以及第二次发布到开发者作品展览馆时的改进做法。

一、为什么要做背卡工具

背单词、记知识点最怕两件事:一是背完就忘,二是不知道今天该复习什么。间隔重复(Spaced Repetition)正好解决这两个问题:根据你对每张卡片的掌握程度,自动安排下一次复习时间,记得牢的隔得久,记不住的很快再出现。于是我在华为云 AI 开发者空间里做了一个纯前端的小工具“碎片背卡”,适合在课间、排队这类碎片时间使用。

二、功能设计

  • 卡片翻转:点击正面查看答案,也支持空格或回车键翻转;
  • 三档评分:忘记 / 模糊 / 记住,按钮上实时显示下次复习时间;
  • 卡片组管理:新建、编辑、删除卡片组,手动添加卡片,支持 JSON 导入导出;
  • 学习统计:今日待复习数量、连续打卡天数、累计复习次数;
  • 数据全部保存在浏览器 localStorage,深浅色自适应,适配手机;
  • 纯原生 HTML / CSS / JavaScript,不依赖后端和任何第三方 CDN。

三、简化版调度算法

完整的 FSRS 需要拟合记忆模型参数,对一个小工具来说太重。我采用了接近 Anki SM-2 思路的简化方案,每张卡片只记录三个量:间隔天数 interval、难度系数 ease(初始 2.5)、复习次数 reps。

  • 记住:ease 加 0.1(上限 3.5),interval 乘以 ease;
  • 模糊:ease 减 0.15(下限 1.3),interval 乘以 1.3;
  • 忘记:ease 减 0.2(下限 1.3),interval 重置为 1 天,明天再复习。

新卡片第一次复习后间隔 1 天,第二次 3 天,之后按难度系数倍数增长。下次复习日期 = 今天 + interval。“今日待复习”就是筛选出到期日期不晚于今天的卡片。

这个方案的好处是逻辑透明、几十行代码就能实现;缺点是没有个性化拟合,对长期记忆的预测不如完整 FSRS 准确。对日常背单词来说已经够用。

四、几个实现细节

  • 翻转动画:用 CSS 3D 的 rotateY 配合 backface-visibility,正反两面叠放,点击时切换类名即可。
  • 连续打卡:记录每天是否有复习行为,从今天往前逐日检查,遇到断档就停止计数。
  • 导入导出:导出时把卡片组序列化为 JSON 文件下载;导入时先校验字段结构,避免坏数据覆盖已有进度。
  • 深浅色:默认跟随系统的 prefers-color-scheme,也可以手动切换,并记住用户选择。

五、发布作品时的改进

这已经是我第二次用开发者作品展览馆的发布 Skill 上架作品。根据第一次踩过的坑,这次提前做了几件事:

  • 先写 .gitignore 再初始化仓库:发布 Skill 会安装到项目下的 .agents/ 目录并生成 skills-lock.json,提前排除后,首次提交就只包含项目源码,不用再重写提交历史。
  • 凭证不落屏:要求智能体用脚本从配置文件读取 GitCode 令牌,只输出字段结构和用户名,不在命令或输出中出现令牌明文。
  • 复用已有委托:首次发布创建的 IAM 自委托 SELF_VERIFY 直接复用,不重复创建,也不改动其他权限。
  • 保留体验隧道:发布后不删除 DevBridge 隧道,作品页的在线体验入口在容器释放前都可以访问。

六、总结

间隔重复的核心思想很简单,难点在于把“什么时候复习”这件事交给程序。一个只有几百行代码的纯前端工具,就能把复习安排得井井有条。后续可以考虑加入复习记录导出和遗忘曲线可视化,让学习效果看得见。

项目代码已开源在 GitCode:hid86006757/study-flashcard。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。