正文在现代 Web 应用中,前端错误与网络失败的可观测性是稳定性的基石。本文基于 Next.js 15 的 App Router 与 Edge Runtime,整合浏览器 Reporting API 与 NEL(Network Error Logging),实现崩溃、弃用与干预等报告的可靠采集与治理。一、启用报告端点与网络错误日志通过中间件下发兼容性的响应头,支持新旧两套标准:// middleware.ts import { NextResponse } from 'next/server' export function middleware() { const res = NextResponse.next() // 新标准:Reporting-Endpoints(Chrome 支持),指向统一端点 res.headers.set('Reporting-Endpoints', 'default="/api/reporting"') // 旧标准:Report-To + NEL 组合,仍有兼容价值 res.headers.set('Report-To', JSON.stringify({ group: 'default', max_age: 10800, endpoints: [{ url: '/api/reporting' }] })) res.headers.set('NEL', JSON.stringify({ report_to: 'default', success_fraction: 0, failure_fraction: 1, sampling_fraction: 1 })) return res } 二、Edge 路由接收与归一化在 App Router 下为 `/api/reporting` 创建路由处理器,确保缓存禁用与最小化响应体:// app/api/reporting/route.ts export const runtime = 'edge' export async function POST(req: Request) { const payload = await req.json().catch(() => null) if (!payload) return new Response(null, { status: 400 }) const reports = Array.isArray(payload) ? payload : [payload] const ua = req.headers.get('user-agent') || '' const sanitized = reports.map((r: any) => ({ type: r.type, // 'network-error', 'crash', 'deprecation', 'intervention' 等 url: r.url || r.body?.url || '', body: r.body ?? null, user_agent: ua, ts: Date.now() })) // TODO: 持久化到日志管道或数据仓库(例如:Supabase/Postgres/对象存储) return Response.json({ ok: true, count: sanitized.length }, { headers: { 'Cache-Control': 'no-store', 'Vary': 'User-Agent' } }) } 三、ReportingObserver 收集弃用/干预事件部分浏览器支持 `ReportingObserver` 用于收集弃用与干预类报告:'use client' import { useEffect } from 'react' export default function ReportingBoot() { useEffect(() => { if (typeof (window as any).ReportingObserver === 'function') { const ReportingObserver = (window as any).ReportingObserver const obs = new ReportingObserver((reports: any[]) => { fetch('/api/reporting', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(reports), keepalive: true }) }, { buffered: true, types: ['deprecation', 'intervention'] }) obs.observe() } }, []) return null } 四、治理要点与验证参数缓存治理:对于错误上报端点,统一设置 `Cache-Control: no-store`,避免 CDN 层误缓存导致投递失败或复用。兼容性:同时下发 `Reporting-Endpoints` 与 `Report-To + NEL`,覆盖不同版本浏览器的实现差异。隐私与体量:上报仅包含必要字段(type/url/body/user_agent/ts),避免敏感数据泄露;体量大时推荐批量与压缩管道。可靠投递:`fetch(..., { keepalive: true })` 有助于页面关闭时的最后一次上报;服务端端点应返回 2xx 并最小化响应体。观测整合:与 Web Vitals RUM、`Server-Timing` 共同形成端到端观测闭环,前端异常与后端阶段耗时可在同一数据域内关联。五、落地建议将 `/api/reporting` 接入企业日志平台或数据仓库,并通过仪表盘展示:每日网络错误率(由 NEL 提供)浏览器弃用与干预事件趋势(由 ReportingObserver 提供)异常类型 Top-N 与影响页面 Top-N结合变更发布窗口与性能基线,建立异常阈值与告警策略,形成可回溯的稳定性治理流程。

发表评论 取消回复