feat(ui): 营销站 UI/UE/UX 治理 P0→P3 + 数字口径 basis 机制 #28
@@ -541,15 +541,20 @@ function scoreRoute(r) {
|
|||||||
if (perr.length) issues.push({ sev: 'P1', cat: 'UE/稳定性', msg: `未捕获异常 ${perr.length} 条`, detail: perr.slice(0, 3) });
|
if (perr.length) issues.push({ sev: 'P1', cat: 'UE/稳定性', msg: `未捕获异常 ${perr.length} 条`, detail: perr.slice(0, 3) });
|
||||||
const rfailAll = [...(d.failedRequests || []), ...(m.failedRequests || [])];
|
const rfailAll = [...(d.failedRequests || []), ...(m.failedRequests || [])];
|
||||||
const rfailNoise = rfailAll.filter(f => THIRD_PARTY_NOISE_RE.test(String(f.url || '')));
|
const rfailNoise = rfailAll.filter(f => THIRD_PARTY_NOISE_RE.test(String(f.url || '')));
|
||||||
// net::ERR_ABORTED = 客户端主动取消。结合两类证据判定是否需要留痕:
|
// net::ERR_ABORTED = 客户端主动取消。结合三类证据判定是否留痕:
|
||||||
// ① 同 URL 后来成功(requestfinished 关联)→ 重调度,完全无害,不留痕
|
// ① 同 URL 后来成功(requestfinished 关联)→ 重调度,完全无害,不留痕
|
||||||
// ② prefetch 资源被打断 → 本身无用户影响,不留痕
|
// ② prefetch 资源被打断 → 本身无用户影响,不留痕
|
||||||
// ③ 其余 abort → INFO 留痕(2026-09-05 实测 /methodology 三图 abort 后 complete=true、URL 全 200)
|
// ③ 同源 script 被取消且该路由无未捕获异常 → 运行时自行取代的请求(App Router 静态 chunk
|
||||||
|
// 预取不带 Sec-Purpose 头,无法按头识别;后果导向:必需 chunk 被取消必然伴随
|
||||||
|
// hydration 失败 → pageErrors 非空,届时仍会以 P1 记录)。闭环成立,不留痕。
|
||||||
|
// ④ 其余 abort → INFO 留痕(2026-09-05 实测 /methodology 三图 abort 后 complete=true、URL 全 200)
|
||||||
const finishedSet = new Set([...(d.finishedUrls || []), ...(m.finishedUrls || [])]);
|
const finishedSet = new Set([...(d.finishedUrls || []), ...(m.finishedUrls || [])]);
|
||||||
|
const noPageErr = perr.length === 0;
|
||||||
const abortedAndGone = f =>
|
const abortedAndGone = f =>
|
||||||
!THIRD_PARTY_NOISE_RE.test(String(f.url || '')) &&
|
!THIRD_PARTY_NOISE_RE.test(String(f.url || '')) &&
|
||||||
f.failure === 'net::ERR_ABORTED' &&
|
f.failure === 'net::ERR_ABORTED' &&
|
||||||
(f.resourceType === 'prefetch' || finishedSet.has(f.url));
|
(f.resourceType === 'prefetch' || finishedSet.has(f.url) ||
|
||||||
|
(f.resourceType === 'script' && noPageErr));
|
||||||
const rfailAbort = rfailAll.filter(f =>
|
const rfailAbort = rfailAll.filter(f =>
|
||||||
!THIRD_PARTY_NOISE_RE.test(String(f.url || '')) &&
|
!THIRD_PARTY_NOISE_RE.test(String(f.url || '')) &&
|
||||||
f.failure === 'net::ERR_ABORTED' && !abortedAndGone(f));
|
f.failure === 'net::ERR_ABORTED' && !abortedAndGone(f));
|
||||||
|
|||||||
Reference in New Issue
Block a user