# NOTES · 开发笔记与排错 > 这份文件记录**改这个插件时的经验、踩过的坑和内部约定**,面向维护者。 > 面向使用者的内容在 [README.md](./README.md)(中文)与 [README.en.md](./README.en.md)(英文)—— > **两份是独立的文件**,不是一个文件里中英混排:混排在 GitHub 上没法用。 > 本文件**只有中文**,因为它是调试过程的记录,逐句翻译会稀释「当时为什么这么想」。 > 结论性的规则本身与语言无关,英文读者照着做也不会错。 **目录** - [开发与验证](#开发与验证) - [排错](#排错) - [内部参考](#内部参考) - [已知的实现瑕疵](#已知的实现瑕疵) --- ## 开发与验证 ```powershell cd X:\github\dsh-openrouter-imagen-v2 npm install npm run check # 五个文件的语法 npm run smoke # Host 半边真跑(桩 Context,不发网络请求、不花钱) npm run preview # Client 半边真挂载 + 生成 preview/*.html npm run load # 打包与加载面检查 npm run all # 以上全部 ``` 四套测试各自的定位: | 脚本 | 项数 | 断言的是什么 | | --- | --- | --- | | `smoke.mjs` | **145** | Host 半边的**契约**:记录能跨重启读回、上限生效、**驱逐的是最旧的**、`/image` 拒绝一切不在记录里的 id、**空白 apiKey 不会被写掉**、**形态不对的密钥在保存时被拒且不落盘**、`/config` 只给密钥头尾预览而不给原文、`DELETE /config/key` 才真正清空、**候选密钥不会被写进设置**、`auto` 值是**省略**而不是发送字符串、越界参考图被拒、`extraJson` 不能换模型 | | `preview.mjs` | **101** | 加载**真实的** `lib/client.js`,用一个小 React 替身真跑 `useState` / `useEffect` / `useRef`,挂载真组件,然后从这些组件生成 HTML —— 所以 `preview/` 里的页面都是**代码渲染出来的**,不是手画的稿子 | | `preflight-load.mjs` | **17** | 打包面:包能按裸名解析、`exports["./client"]` 在、patch 在、`undici` 能从包内解析(v1 的失败模式)、`inject` 恰好是 `['tools']` | `preview.mjs` 额外断言:只注册了 `sidebar.panellist` 与 `main`(**没有碰 `conversation.*`**)、 12 个比例都在且带数字、确认开关默认关、输入框下方没有说明段落、**设置弹窗在未打开时不进 DOM**、 密钥字段默认掩码、已存密钥只显示头尾预览、**侧栏入口渲染出的「图像生成」只有一个**、 参考图的取/贴/拖都接到同一个入口且**真的随请求发出**、`+` 按钮确实会打开文件选择器、 种子的位置与实际使用值会写回。 ### 断言要打在会失败的地方 反复出现的教训:**声明存在 ≠ 生效,辅助函数正确 ≠ 它被用上了。** - 一条只断言「`width:86px` 这条声明存在」的 CSS 测试是绿的,而声明被更高权重的选择器压住了。 - `sessionCwdFrom` 这个辅助函数单独测全绿,删掉路由里那一行调用**也照样全绿**。 - 断言「源文件里出现过「相对会话目录:」这五个字」是绿的,而那行实际黏在了一长串 Windows 绝对路径后面。 所以:断言优先打在**渲染结果**和**真实调用路径**上,而不是源码文本上。 ### 变异测试是「断言非空转」的唯一证明 改了逻辑之后,把源码临时改回去跑一遍测试,确认它真的会红,再还原。 ``` 回执不再打印 尺寸 → 3 FAIL 比例比较永不触发(if(false)) → 5 FAIL attachment 宽度退回裸 Number() → 2 FAIL 记录与路由退回读 attachment 宽高 → 1 FAIL PNG 宽高读反 → 3 FAIL JPEG 不再跳过 DHT → 2 FAIL 容差收紧到 0 → 2 FAIL ``` > 变异时优先改**语义**而不是**删代码**。删掉三行警告会留下一个孤立的 `}` 变成语法错误 —— > 那证明的是 `node --check` 有用,不是断言有用。改成 `if (false) {` 才是有效的变异。 **源码正则断言是逃生舱**,只用于 smoke 跑不到的接线(比如「Host 确实调用了这个辅助函数」)。 能用真实调用覆盖的地方,不要用正则。 ### smoke 没有 API key、没有网络 这条决定了 smoke 能断言什么:**在没有 key、没有网络的环境下,拿到的是拒绝信息而不是 API 错误, 这句话本身就是「请求没发出去」的证据**。任何需要真发请求才能验证的行为,只能用源码正则兜。 ### 预览与断言的几个陷阱 > 涉及界面文字时,断言优先打在**渲染出的 DOM** 上而不是源码上:源码里可能留着已经没用的 > CSS 类(`.dsh-iv-entrytxt` 就是),grep 会命中它而让检查**假绿**。 > 断言 DOM 时先剥掉 `