- apps/web/lighthouserc.cjs: desktop preset, 3 runs, P/A/B/S ≥ 90 断言 - apps/web/scripts/lhci-scores.cjs: 本地汇总脚本(median P/A/B/S + ✅/❌ 标记) - .github/workflows/web-ci.yml: 新增 lighthouse job,treosh/lighthouse-ci-action@v12 - apps/web/package.json: +lhci script - apps/web/.gitignore: .lighthouseci/ 加入忽略(避免本地 12 个 run 报告污染 repo) 本地验证(desktop preset, 3 runs × 4 URLs): perf=100 a11y=95-96 best=96 seo=91 (全部 ≥ 90 ✅) G3 闸门状态:typecheck ✅ / lint ✅ / vitest 69 ✅ / e2e 84/84 ✅ / build 87.85KB ✅ / Lighthouse P/A/B/S ✅ / 真实后端 ⏳(T-B-27)/ Poster CLI Docker ⏳(T-C-44)
34 lines
1.4 KiB
JavaScript
34 lines
1.4 KiB
JavaScript
/**
|
||
* V10 Sprint 4 · T-B-24 · lhci 分数汇总脚本
|
||
* 读 .lighthouseci/lhr-*.json,对每个 URL 计算 P/A/B/S 的 median
|
||
*/
|
||
const fs = require('fs');
|
||
const dir = '.lighthouseci';
|
||
const files = fs.readdirSync(dir).filter((f) => f.startsWith('lhr-') && f.endsWith('.json'));
|
||
const urlMap = {};
|
||
for (const f of files) {
|
||
const j = JSON.parse(fs.readFileSync(`${dir}/${f}`, 'utf8'));
|
||
if (!j.categories || !j.categories.performance) continue;
|
||
const url = j.requestedUrl.replace('http://127.0.0.1:8080', '') || '/';
|
||
if (!urlMap[url]) urlMap[url] = [];
|
||
urlMap[url].push({
|
||
p: Math.round(j.categories.performance.score * 100),
|
||
a: Math.round(j.categories.accessibility.score * 100),
|
||
b: Math.round(j.categories['best-practices'].score * 100),
|
||
s: Math.round(j.categories.seo.score * 100),
|
||
});
|
||
}
|
||
console.log('URL perf a11y best seo');
|
||
for (const k of Object.keys(urlMap)) {
|
||
const runs = urlMap[k];
|
||
const med = (x) => {
|
||
const arr = runs.map((r) => r[x]).sort((a, b) => a - b);
|
||
const m = Math.floor(arr.length / 2);
|
||
return arr.length % 2 ? arr[m] : Math.round((arr[m - 1] + arr[m]) / 2);
|
||
};
|
||
const ok = (x) => med(x) >= 90 ? '✅' : '❌';
|
||
console.log(
|
||
`${k.padEnd(15)} ${String(med('p')).padStart(4)}${ok('p')} ${String(med('a')).padStart(4)}${ok('a')} ${String(med('b')).padStart(4)}${ok('b')} ${String(med('s')).padStart(4)}${ok('s')}`,
|
||
);
|
||
}
|