报表里外链点击次数总比实际少三成 加日志发现离开页面前那条上报状态是 canceled 改成同步 XHR 能发出去 但控制台又提示同步请求影响体验。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
const body = JSON.stringify({e: 'click', id: 12});
navigator.sendBeacon('/collect', body);
页面卸载时没完成的 XHR 会被浏览器直接取消 请求发出去了响应回不来 服务端可能收不到 同步请求能发完却会拖慢跳转。这一点先确认清楚,后面就不用反复试。
「页面卸载埋点丢失」这类改动最怕改一半,回滚脚本先准备好,再动生产。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。
动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。
具体做法是,卸载阶段改用 navigator.sendBeacon 由浏览器接管 页面关了也会发完;数据量大就改用 fetch 的 keepalive 方式去发 注意它有 64KB 的体积上限;关键字段压到最小 只传 id 和事件名 细节服务端补。
改完照着核一遍,连点二十次外链 报表能对上二十条 服务端日志里没有 canceled 记录。
