# 开发笔记 踩过的坑与验证器的失效方式。给未来的自己(和接手的人)看。 这些内容不属于 README:README 讲「它是什么、怎么用」,这里讲「为什么会写成现在这样」。 --- ## ⚠️ 五次「验证器骗过了自己」 这个插件的返工史里,**最贵的错误都不是产品 bug,而是验证器的 bug**。五次都是同一类问题:验证器造了一个比现实**好看**的世界,然后拿它当证据。第五例是上线前做接口核查时才发现的,比前四次更隐蔽——因为它连产品行为都是对的,只是**在别人的机器上会静默失效**。 ### ① 样式从未被注入 **症状**:方块墙挤在页面最下面、桌宠只剩一行裸文本、里程表数字粘成 `2,998,037,680tokens`。 **根因**:注入样式写的是 ```js const styles = ctx.get('styles') // ← 永远是 undefined if (styles !== undefined && styles.insert) ctx.effect(() => styles.insert(CSS), …) ``` `styles` **不是一个 Cordis 服务**。查遍 web profile 的所有包,没有任何地方 `provide('styles')`——它是动态插件(`evaluateClientHalf`)的**函数参数**,而本插件走的是 `__ModuleLoader__.load({ id, factory })` 的 bundle 形式,那条路径上没有这个参数。于是 11KB CSS 一行都没进页面: | 失效的规则 | 界面表现 | |---|---| | `.dsh-tu-wall-grid { display: grid }` | 30 格竖排成一列 → 挤占页面最下方 | | `#dsh-tu-pet { position: fixed }` | 桌宠退回文档流 → 只剩裸文本 | | `.dsh-tu-odo-item { white-space: nowrap }` | 「…680tokens」粘在一起 | **为什么测试没抓到**(两层都失效了): 1. `test/client.smoke.mjs` 的 mock ctx **伪造了** `styles` 服务,于是 `insert` 被调用、断言「注册了样式」通过——测的是「有没有调用」,不是「CSS 有没有进 DOM」 2. `tools/visual-check.mjs` 为了拿 CSS 字符串,同样伪造了 `styles`,把 CSS 直接内联进生成的 HTML——**验证器替被测插件把样式注了进去**,截图当然完美 两者都绕过了它们本该验证的那条路径。这是「验证器自己作弊」的典型案例。 **修复与加固**: - 插件自己建 `