/** * Dogfood UI 审计报告生成器 * * 把 ui-audit.mjs 的多主题探针数据 + hardcoded-color-audit.mjs 的静态扫描结果, * 汇总成一份可阅读的 HTML 报告(含截图画廊与逐路由明细),供人工判定与排期。 * * 用法: * node scripts/audit/ui-audit-report.mjs * node scripts/audit/ui-audit-report.mjs --light
| 项目 | 浅色主题 | 深色主题 |
|---|---|---|
| 数据目录 | ${esc(L?.dir || '-')} | ${esc(D?.dir || '-')} |
| 路由数 | ${L?.routeCount ?? '-'} | ${D?.routeCount ?? '-'} |
| 视口 | desktop 1440×900 · tablet 768×1024(核心页) · mobile 390×844 | |
| 探针维度 | 对比度 · 横向溢出 · 触控目标 · 图片 alt · 标题层级 · 表单 label · 文本裁剪 · 键盘焦点 · console/网络异常 · LCP/CLS | |
无数据
'}无数据
'}${esc(worstContrast.route)} ${esc(worstContrast.vp)} · 元素 ${esc(worstContrast.sel)} · 文案「${esc(worstContrast.text)}」| 维度 | 问题 | 涉及路由 |
|---|---|---|
| ${esc(g.cat)} | ${esc(g.tpl)}
${g.samples.length ? `样本
| ${esc(g.routes.join(' '))} |
深色主题由 Playwright colorScheme: 'dark' 驱动,走项目三态偏好的 system 解析链路,
与 e2e 视觉回归口径一致;不使用事后 setAttribute('data-theme')(会被挂载效果覆盖)。
| 路由 | 浅色问题数 | 深色问题数 | 增量 |
|---|---|---|---|
| ${esc(x.route)} | ${(x.light.P1 || 0)}+${(x.light.P2 || 0)}+${(x.light.P3 || 0)} | ${(x.dark.P1 || 0)}+${(x.dark.P2 || 0)}+${(x.dark.P3 || 0)} | +${x.delta} |
计数格式:P1+P2+P3。增量 > 0 表示该路由在深色下暴露了额外问题(典型为对比度不足、硬编码白底不翻转)。
` : 'Tailwind 原生 bg-white / bg-gray-* 是硬编码值,深色下不翻转 → 整页恒白。
扫描 ${esc(color?.scannedFiles ?? '-')} 个文件,命中 P0 ${esc(color?.counts?.P0 ?? '-')} /
P1 ${esc(color?.counts?.P1 ?? '-')} / INFO ${esc(color?.counts?.INFO ?? '-')}
(INFO 多为 bg-white/10 一类半透明叠加,属正确用法,非缺陷)
| 级别 | 文件 | 行 | 类名 | 原因 |
|---|---|---|---|---|
| ${esc(v.sev)} | ${esc(v.file)} | ${esc(v.ln)} | ${esc(v.cls)} | ${esc(v.why)} |
修复映射约定:bg-bg-primary → 页面/大块骨架;bg-bg-elevated → 带边框的卡片/表单/图标盒。
浅色下 bg-white 与两者同值 → 改动在浅色主题零像素差异,只修深色。
| 路由 | 浅色 P1/P2/P3 | 深色 P1/P2/P3 | 问题摘要(深色) |
|---|---|---|---|
| ${esc(r.route)} | ${badge(r.lc)} | ${badge(r.dc)} | ${r.dIssues.length
? `${esc(r.dIssues.length)} 条
|
# 1) 起本地站点(URL 必须是 localhost,127.0.0.1 会被 allowedDevOrigins 拒绝 → chunk 403 → hydration 失败) npm run dev # 2) 浅色全站审计 node scripts/audit/ui-audit.mjs # 3) 深色全站审计(核心页含整页长图) node scripts/audit/ui-audit.mjs --theme dark --full-page # 4) 静态硬编码色盘点 node scripts/audit/hardcoded-color-audit.mjs # 5) 生成本报告 node scripts/audit/ui-audit-report.mjs
| 对比度违规 | ${m.contrastTotal} |
| 未捕获 JS 异常 | ${m.pageErrors} |
| console 错误 | ${m.consoleErrors} |
| 请求失败 | ${m.failedReq} |
| 触控目标 <24px | ${m.touchTotal} |
| 图片 alt 问题 | ${m.altTotal} |
| 表单缺 label | ${m.labelTotal} |
| 键盘聚焦无指示 | ${m.noFocusTotal} |
| 文本被裁剪 | ${m.clipTotal} |
| LCP 均值 / 最大 | ${m.lcpAvg ?? '-'} ms / ${m.lcpMax ? m.lcpMax.v + ' ms(' + m.lcpMax.route + ' ' + m.lcpMax.vp + ')' : '-'} |
| CLS 最大 | ${m.clsMax ? m.clsMax.v + '(' + m.clsMax.route + ')' : '0'} |
| 页面平均加载 | ${m.loadAvg ?? '-'} ms |