# dev/ — 开发期脚本 这里的东西**不是运行时依赖**,删掉插件照样跑。保留它们是因为每一条都对应一个踩过的坑: 能复现「为什么这么写」,也能在改了 `client.js` / `index.js` 之后当回归守卫。 两类脚本: - **不需要 DSH 的**:纯读文件做断言,或者用假 React 走一遍组件树。随手就能跑。 - **需要运行中宿主的**:打真接口,默认从 `DSH_PORT`(DSH Web 的端口)拼出 `http://127.0.0.1:/dsh-anime/api`,个别脚本认 `DSH_ANIME_API` 直接给完整前缀。 ```bash # 在仓库根目录 node dev/load-client.mjs DSH_PORT=13196 node dev/test-anich.mjs ``` ## 不需要宿主的 | 脚本 | 干什么 | | --- | --- | | `load-client.mjs` | 桩 `window.__ModuleLoader__` + 桩 `require` 载入 `client.js` 并调用 `apply(ctx)`,打印注册到的 slot(应为 `main:dsh-anime \| sidebar.panellist:dsh-anime`)。改完 `client.js` 先跑这个:`Cannot access 'X' before initialization` 这类模块初始化顺序错误在编辑器里看不出来,这里会直接报 | | `render-check.mjs [id]` | 用假 React 走完整组件树,渲染指定标签页(`anilist` / `animeko` / `search` / `downloads` / `extensions` …),断言没有裸 React 元素泄漏、首屏有字 | | `audit-tkeys.mjs` | `T('key')` 用到的每个键是否在 `ZH` / `EN` 两份字典里都存在 | | `audit-routes.mjs` | Host 路由与 Client 调用是否对得上(有没有调用不存在的路由) | | `audit-libs.mjs` | `lib/*.js` 的导出是否都被用到、有没有引用不存在的文件 | | `audit-index.mjs` / `audit-engine.mjs` / `audit-css-hooks.mjs` / `audit-tabbar.mjs` | 索引结构、BT 引擎接线、CSS 钩子、标签栏的静态一致性检查 | | `check-default-sources.mjs` | 空设置下应当**只有 AniList** 是开着的;给默认关闭的源改设置不能把它隐式打开;显式打开后改设置不能被关回去 | | `check-theme-player.mjs` | 主题曲面板必须渲染项目自己的 `Player`,不能退回原生 `