setter本身不支持队列排空或满载触发,但可作为轻量级响应式入口联动队列管理器,实现埋点自动收集、缓冲与批量异步上报,并支持动态配置、优先级处理、卸载兜底及生产级容错。

Setter 属性本身不直接支持“队列排空”或“满载触发”,但它可作为轻量级响应式入口,配合外部控制逻辑,实现埋点数据的自动收集、缓冲与批量提交。关键不在 Setter,而在如何用它作为信号开关,联动一个有状态的队列管理器。
用 Setter 拦截埋点调用,统一注入队列
不要在每个埋点位置手动 push 到数组,而是把埋点行为封装成属性赋值:
class Tracker {
#queue = [];
#maxSize = 100;
#autoFlush = true;
set event(data) {
this.#queue.push({ ...data, ts: Date.now() });
if (this.#autoFlush && this.#queue.length >= this.#maxSize) {
this.flush();
}
}
flush() {
const batch = this.#queue.splice(0, this.#maxSize);
// 发送到上报接口(如 fetch + Promise 队列节流)
this.#send(batch);
}
#send(batch) {
// 实际上报逻辑,可加防抖、重试、采样
}
}
const tracker = new Tracker();
tracker.event = { action: 'click', el: 'btn-submit' }; // 触发入队
结合异步调度,避免阻塞主线程
Setter 同步执行,但上报必须异步。可在 flush 中使用微任务或 requestIdleCallback 延迟执行:
- 用 Promise.resolve().then(() => this.#send(batch)) 推迟到下一个微任务,不卡 UI
- 对非紧急埋点,用 requestIdleCallback 等待浏览器空闲时再发,降低性能影响
- 若队列持续增长,可加时间兜底:启动定时器,每 3s 强制 flush 一次未满队列
支持动态容量与条件排空
Setter 可接收配置参数,让“满载”逻辑更灵活:
- 定义 set config({ maxSize, minInterval, sampleRate }) 动态调整策略
- 埋点时传入优先级字段:tracker.event = { ..., priority: 'high' },高优事件立即 flush
- 页面卸载前监听 beforeunload,强制清空剩余队列(注意:仅限少量数据,避免阻塞)
注意边界:Setter 不是万能队列引擎
它适合轻量聚合与信号触发,但不替代专业队列库。真实生产环境还需补充:
- 内存泄漏防护:限制队列最大长度(如超过 500 条自动丢弃旧数据)
- 序列化容错:埋点数据可能含函数、undefined、Symbol,需 JSON.safeStringify 过滤
- 网络失败重试:flush 后记录 pending batch,失败时存入 localStorage,恢复后补报
- 与 PerformanceObserver / IntersectionObserver 等原生 API 结合,实现曝光、长任务等自动埋点











