Files
gaokao-volunteer-system/apps/web/scripts/lhci-scores.cjs
Frontend Developer 61ba0ca987 Sprint 4 T-B-24 · Lighthouse CI (G3 闸门真实化)
- 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)
2026-07-04 10:08:10 +08:00

34 lines
1.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 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')}`,
);
}