跳转至

组件预览示例进入正式搜索 · 2026-10-22

用户反馈与来源

真实用户没有高等数学课程,首页搜索组件却出现“高等数学A(1)”“第一次小作业”“第二讲 课件.pdf”,日期为当前日期加两天。三项文本与日期规则均匹配 state/data.ts 内置预览种子。这两条内容来自应用自带示例。

旧 PreviewDataProvider 在 layout effect 中调用 seedPreviewData:覆盖共享内存缓存和模块级学习快照,并用全局布尔值关闭学习加载。抽屉仍挂载时新增真实组件,真实 hook 的初始 React 状态会读到示例;恢复共享缓存也无法清理已经初始化的组件状态。并发预览的还原顺序还会覆盖期间完成的真实刷新。

修复

  • 增加 React Context 数据作用域;createPreviewDataset 只生成数据,每个预览树拥有独立只读 Map。
  • 预览 Provider 移除全局写入、全局开关和卸载还原,语言变化只重建预览子树。
  • 15 个相关数据 hook 使用作用域内缓存,预览 reload 不拉取学校接口、不写真实缓存;预览中的学习组件不订阅真实学习广播。
  • 非 React 的学习/校园/校历快照继续读取真实存储,后台刷新不受预览影响。
  • 保留旧浏览器驱动使用的全局 fixture API,入口仅 DEV 可用;生产分支拒绝调用,产品预览不再使用它。原有二级课表驱动仍可测试真实刷新路径。
  • 发布工作流加入预览数据边界测试。

验证

  • tools/preview-data-isolation-browser-test.mjs:9 项通过,使用真实数据 hook、真实 SearchPage、两个嵌套预览和 StrictMode。覆盖既有搜索、新增搜索、缓存引用/键集合/持久化不变、预览 reload 零请求和零广播、期间真实刷新、关闭后保留最新数据、语言切换及无运行错误。课程数据全部为隔离虚构账号夹具,没有连接学校或使用用户资料。
  • tools/preview-data-isolation-test.mjs:只读作用域、缺失数据不调用 fetcher、任意 card 参数回退、生产分支拒绝全局 fixture 注入,Provider 无全局变更生命周期。
  • 二级课表解析 11 项,中文/英文学校响应 × 三模式 × 桌面/手机浏览器 85 项回归通过。
  • TypeScript、OneGUI 护栏、中英文各 7577 个键、62 个 Android 本地兜底通过;正式前端构建通过(保留既有分块体积提示)。

本机匿名证据:/Volumes/OneTHUBuild/artifacts/preview-data-isolation/。源码隔离验收阶段使用浏览器与生产边界测试。随后按用户要求重建并替换三端 0.11.1 安装包;本轮未进行实机安装。

安装包修订与升级

此修复晚于 0.11.1 首次发布。首次安装包对应源码 a7fe5359、Android code 11008;用户随后要求替换 0.11.1,三端已统一重建至 7413291a,Android code 11009。GitHub Release、清华云盘各系统目录、双源清单和官网校验快照均使用新产物,匿名下载与 SHA256 验证通过,详见 发布修订记录。

已安装旧 0.11.1 的用户请重新下载并覆盖安装;用户白板、账号和个人数据保留。旧包完全退出再打开可以暂时清理本次运行的示例状态,但再次打开预览仍可能触发,建议安装修订包。当前结论确认此次内置示例的来源,并未扩展为全部外部同步历史的审计结论。