# src/ 重构 TODO > 分支:`dev-refactor`。每个 Phase 结束时应用可正常运行并单独提交一次 commit。 > 核心约束:**不改变任何用户可见行为、不改变 localStorage 数据结构**(老用户数据必须无缝兼容)。 > **进度说明(2026-07-19 核对更新)**:代码级目标已全部达成。以下为与本文档原计划的已知差异,均已核对/对齐: > - **提交粒度**:实际合并为 4 个 commit 提交(`9e5ddef`→`8686e65`→`9c4fc0b`→`56a0040`),非逐 Phase/逐页粒度;下文各「提交」项据此勾选。 > - **CSS 结构**:已补齐 `pages/home.css`/`pages/words.css`,并把原 `components-extended.css`/`learn-session.css` 拆解归位、新增全局 `responsive.css`(见「三」已更新的目录树)。 > - **路由**:`core/router.js` 采用单个 `registerPage(page, renderFn)`,与「六」示例一致。 > - **window 桥接**:改为一次性重构,终态无桥接残留(与计划最终目标一致)。 > - **仍未完成**:Phase 0 的 `before-refactor` tag 未打;尚未合并回 `main`;「验收清单」等人工冒烟项需实跑。 ## 一、现状分析 | 文件 | 行数 | 问题 | |---|---|---| | `src/script.js` | 5139 | 单文件巨石:约 230 个函数全部挂在全局作用域,常量/状态/服务/8 个页面混在一起 | | `src/styles.css` | 3346 | 单文件,含 40+ 个注释分节,主题变量与页面样式耦合 | | `src/index.html` | 84 | 基本干净,仅需改脚本引入方式 | 关键技术债: - **119 处内联 `onclick=`**(另有 7 处 `oninput=/onchange=/onkeydown=`)写在 JS 拼接的 HTML 字符串里,强依赖函数全局可见 —— 这是拆分 ES 模块的最大障碍。 - 全局可变单例 `state`(script.js:97)+ 分散的 `saveXxx()` 持久化函数,无统一入口。 - TTS 部分(script.js:356-753,约 400 行)内含多个模块级可变缓存(`_ttsRequestSeq`、云端音频缓存、有道预取缓存),需整体封装。 - Chart.js 实例 `_studyChart` 需在重渲染时销毁,生命周期隐蔽。 - 手动维护缓存版本号 `?v=20260715-1`(index.html:17、82)。 - 无测试、无 package.json、无构建工具。 ## 二、重构目标与原则 - [x] 目标:script.js 已按职责拆为 ES 模块(常量 / 状态存储 / 核心 UI / 领域服务 / 页面);大页面进一步拆出自动播放、批量文件、测验会话/音频和设置数据模块,单文件控制在 ~500 行内。 - [x] 目标:消灭全部内联 `onclick=`,改为 `data-action` 事件委托。 - [x] 目标:styles.css 按现有注释分节拆分为多个 CSS 文件。 - [x] 原则:**保持无构建(no-build)**,使用浏览器原生 ES Modules(`