概述目标:采集核心Web Vitals(LCP/FID/CLS)并低开销上报,实现端到端性能可观测与问题定位。原生实现:无需第三方库,使用`PerformanceObserver`与`sendBeacon`可靠上报。核心与实战采集LCP:const lcpObserver = new PerformanceObserver((list) => {
const entries = list.getEntries();
const last = entries[entries.length - 1];
if (last) reportMetric('LCP', last.startTime);
});
lcpObserver.observe({ type: 'largest-contentful-paint', buffered: true });
采集FID:const fidObserver = new PerformanceObserver((list) => {
const first = list.getEntries()[0];
if (first) reportMetric('FID', first.processingStart - first.startTime);
});
fidObserver.observe({ type: 'first-input', buffered: true });
采集CLS:let cls = 0;
const clsObserver = new PerformanceObserver((list) => {
for (const entry of list.getEntries()) {
if (!entry.hadRecentInput) cls += entry.value;
}
reportMetric('CLS', cls);
});
clsObserver.observe({ type: 'layout-shift', buffered: true });
上报函数:function reportMetric(name, value) {
const payload = {
name,
value,
path: location.pathname,
ts: Date.now(),
serverTiming: performance.getEntriesByType('navigation')[0]?.serverTiming || []
};
const blob = new Blob([JSON.stringify(payload)], { type: 'application/json' });
navigator.sendBeacon('/rum/collect', blob);
}
示例关联后端阶段性能:// 后端响应头示例:
// Server-Timing: route;dur=12, db;dur=45, cache;dur=5
// 前端通过navigation entry的serverTiming字段关联
验证采集:console.log(performance.getEntriesByType('navigation')[0]);
验证与监控网络与可靠上报:观察`/rum/collect`的接受量与状态码;在离开页面时`sendBeacon`仍能可靠发送。数据质量:过滤`hadRecentInput`的layout-shift;仅计算缓冲的最大LCP条目。关联度:结合后端`Server-Timing`与trace上下文,定位慢路径。常见误区使用同步XHR上报导致阻塞与丢失;应使用`sendBeacon`或`keepalive`的`fetch`。未启用`buffered`导致早期指标丢失;需在observer中开启缓冲。忽视CLS累计逻辑,错误地仅取最后一次值;需累积无输入产生的layout-shift。结语通过原生PerformanceObserver与可靠上报通道可低成本落地RUM与Web Vitals监测,并与后端时序关联实现端到端优化。

发表评论 取消回复