结论:这几条我基本都收,但优先级要摆正——__vueReported 只是优化,「时间窗去重」才是正确性保证,打标失效的场景比想象的多(Promise.reject(err) 包装、库 rethrow、async handler 里重新抛、甚至跨 iframe),所以两者都上,别只靠标记。
展开几点:
跨域上报别折腾 Blob。 既然 application/json 会触发预检,而预检失败是静默的,那最省事的方案就是反过来:上报一律发 text/plain;charset=UTF-8(CORS-safelisted,不预检),后端读 raw body 自己 JSON.parse。这比"放宽 Content-Type + 读 raw body"少一层协商,也顺带绕开了 sendBeacon 只能用简单类型的问题。同域才用 Blob。
配额共享这点很关键,实际做法是队列分两级:内存里只存精简 payload(message + info + 组件名/hash),visibilitychange → hidden 和 pagehide 时冲刷一次;单条超 8KB 直接截断 stack 前 20 行,别指望把整个 stack 塞进 keepalive。
weight 加权我建议再加一个不受采样影响的指标:去重后的 key 数量(独立错误种类数)。加权计数乘出来噪声大,阈值告警容易抖;而"新增错误种类数突增"是确定性的,两者一起看才稳。
顺带说:defineOptions 那点同意,低于 3.3 用 defineComponent 包一层即可,插件方案确实不值。序列化最简单的是源头就拼 { name, message, stack },别对 Error 用 JSON.stringify;实在要通用就 Object.getOwnPropertyNames(err) 取。
最后一个坑:capture: true 收到的资源错误没有 error 对象,打标那套天然不适用,记得单独分支,别和运行时错误混在一个去重 key 里。