单文件、零依赖、可安装到手机桌面的离线学习应用。从词库、语音、复习算法到缓存策略,整套工程都在本地闭环运行——无账号、无联网上报、无后端服务器。
手写 SM-2 风格难度系数 ease(默认 2.5,限幅 1.3~2.8):答对 +0.15、答错 -0.2,间隔按 easeIdx 在 [1,2,4,7,15,30] 天里偏移——越难的词跳得越慢、越简单的拉得越远。
// 间隔天数(天) EASE_DEF = 2.5 // 限幅 1.3~2.8 if 答对: ease += 0.15 if 答错: ease -= 0.2 due = today + INTERVALS[easeIdx(stage, ease)]
安装即接管页面,资源更新后自动刷新,根治 PWA「常驻不重启」老问题。
install → skipWaiting() update → controllerchange → location.reload()
设备缺失语音引擎时,用 edge-tts 预录本地音频优先播放,失败则静默降级。
speak(text): if AUDIO_MAP[text]: play(local_mp3) else: webTTS(text)
按单元统计错次(热力色阶)+ 掌握度(进度条),精准定位薄弱环节。
weakByUnit[unit] = {
sel, spell, sent // 错题计数
}
master = solved / total // 进度条
真实开发中被「卡住」过、并逐一破解的工程问题——每一个都来自真机实测。
AUDIO_MAP 内嵌;speak() 优先播本地音频,无则降级 web TTS,彻底摆脱运行时 TTS 依赖。speak(text): if AUDIO_MAP[text]: play(local_mp3) else: webTTS(text)
try/catch 后必执行 skipWaiting() 抢接管;注册后监听 controllerchange → saveState() 后 location.reload();页面可见时(visibilitychange)主动 reg.update() 查新。双保险根治缓存陈旧。install → skipWaiting() // 必执行 update → controllerchange → saveState(); location.reload()
/audio/ 走 cache-first 永久离线;仅 install 预缓存壳资源(index / sw / icon),音频按需 fetch 时缓存;部署锁定 GitHub Pages(*.github.io 国内可直连)。weakByUnit[unit] = {sel, spell, sent} 三维计数;进度页双维度热力图(色=错次、蓝条=掌握度);首页推荐「去练某单元某题型」,单元测试与闯关两路错题同源汇聚。weakByUnit[unit] = {
sel, spell, sent // 错次计数
}
// 色阶: 错次→红 ; 蓝条: 掌握度
rebuild / expand / validate)管词库,脚本式校验词数一致;AUDIO_MAP 由脚本生成,保证与词库同源同步,改词后一键重生成音频。