# 扩展后台预加载运行时smoke ## 诊断流程样例 ### 输入 - `extension-dir`: `~/Documents/product-bu/obsidian/obsidian-clipper/dist` - `page-url`: smoke 脚本启动的本地 HTML 页面 - `openrouter`: smoke 脚本启动的本地 mock endpoint,返回一个固定 data URL,并记录请求次数 - `wait-ms`: 65000 或更长,覆盖 60 秒预加载阈值 ### 流程 1. 运行 `npm run build:chrome` 生成 unpacked extension。 2. 运行 `npm run smoke:scholar-preload -- --wait-ms 65000 --mock-delay-ms 300`。 3. 脚本用临时 Chrome profile 加载 `dist/`,打开 smoke page,但不打开 popup。 4. 等待 60 秒后,检查 background service worker 是否已收到 `scholarNotePreloadEligible`,并查询 `getScholarNotePreloadStatus`。 5. 打开 popup 或直接发送 `getScholarNoteImage`,确认它复用 pending/ready cache,而不是重新发起生图链路。 ### 成功信号 - popup 打开前,后台状态已经从 `idle` 进入 `pending` 或 `ready`。 - mock OpenRouter 请求数保持为 1。 - 手动点击后返回同一个 `pageKey`,并渲染图片或等待同一个 pending promise。 ### 失败信号 - 页面打开 70 秒后后台仍是 `idle`。 - popup 打开后才出现第一条 OpenRouter 请求。 - 手动点击导致 request count 从 1 变 2。 - UI 只显示“正在生成”,但后台没有 ready/pending 状态可解释。