Changelog
本页内容由 VitePress 直接 include
packages/lens/CHANGELOG.md,changesets 在每次发版时自动维护,无需手工编辑。首个正式版本发布前,下方暂无版本记录。
@tripo3d/lens
1.4.0
Minor Changes
056c11f: hide 后台刷新(hidden-refresh):stale-page-refresh 新增第二条触发路径——页面存活超过
minPageAgeMs后发生 hide,延迟delayMs在后台执行一次刷新,覆盖「切走后不再回来」的会话。- 新增
HiddenRefreshCollector与共享 receipt 纯函数层refresh-gate,receipt 消费权仍归 on-show 采集器(confirmed 不双报)。 - 远端配置新增
performance.stalePageRefresh.onHide(enabled/delayMs/minPageAgeMs);缺省或非法时只关该子路径,不影响已上线的 on-show 路径。 - 事件契约只增不改:
tags.trigger区分on-show/on-hide、新增tags.reason = timer_missed、data.pageAgeMs;op与stage不变,下游查询零破坏。 - 单次语义:后台刷出的页面出生即 hidden,不再武装;延迟窗口内用户返回即取消。
- 新增
1.3.0
Minor Changes
8030af4: 页面 hide/show 刷新整个页面:新增 stale-page-refresh / stale-route 性能采集能力,扩展 remote-config 配置项;最后一次上报携带请求头,避免 401 鉴权失败。
(补齐 #263 遗漏的 changeset:该 PR 已合入 main,但配套 changeset 子 PR #264 被误关,导致 lens 未发版。)
1.2.0
Minor Changes
0e6328b: 结构性修复卸载竞态:此前 L4 管线为无条件异步(async process 至少一个微任务),而队列卸载兜底在同一次 pagehide 派发里同步排空,导致 dwell 的 leave/hide 标记与 performance 插件的卸载时刻数据几乎全部丢失(真实卸载路径 leave 送达率 ~0)。本次两刀根治:
- 管线条件同步化:beforeEmit 钩子缺失或同步返回时,事件从 emit 到入队全同步完成;钩子返回 Promise 才转异步。
Pipeline.process返回类型相应拓宽为WireItem | null | Promise<WireItem | null>(await 调用方源兼容)。 - 生命周期相位派发:
LifecycleAdapter.onHide/onUnload新增 collect/flush 相位(缺省 collect),同一次派发内采集者先产出、队列排空后执行,「先采集后排空」成为时序契约。
修复后 leave/hide 标记与 perf 卸载数据同步进入首批卸载 keepalive,不依赖卸载后微任务仍会执行;
beforeEmit公开契约(可同步或异步)不变。同步入队随之带来一条新竞争路径,一并收口:collect 相位的采集者同步入队后,
push的即时 flush(P0 入队即发 / maxBatch 满)会在 flush 相位之前同步 drain 走整个队列,使这批事件改走常规路径——带X-DeviceId头(跨域需预检 OPTIONS,卸载期会被丢弃)且丢掉「先落快照再发」的兜底。现由LifecycleAdapter.isUnloadDispatching()标出派发窗口,窗口内push不抢跑,整批仍交卸载兜底收口;代价是此期间入队的 P0 拿不到真回执,按「卸载排空,回执作废」reject(与滞留队列的 P0 同一口径)。同步化只改「入队时机」,不改「投递完成」语义:两条分支产出的投递 promise 一律登记在途集,故
flush()仍等 P0 送达回执(1.1.2 保证),void ctx.emit(e)这类不加.catch的调用也仍不会冒出 unhandledrejection。- 管线条件同步化:beforeEmit 钩子缺失或同步返回时,事件从 emit 到入队全同步完成;钩子返回 Promise 才转异步。
1.1.3
Patch Changes
- 924ba10: - @tripo3d/lens & @tripo3d/trace: landing 上报去重窗口从「当日一次」改为「滚动 1 分钟一次」,去重存储由日期串改为标记时间戳,旧数据自动 GC 无需迁移
1.1.2
Patch Changes
- ac99915: 修复
flush()追不上 L4 pipeline 的时序竞态:事件从 emit 到入 L5 队列存在异步微任务窗口,业务同步连写track(...); flush()(典型场景:整页跳转前手动 flush)时,flush 会对着空队列空转、一个请求都不发,事件滞留到 30s 调度或页面卸载兜底,跳转场景下表现为丢事件。现在flush()先等调用时刻已在途的 emit 落队(快照一次,flush 期间新 emit 不追),再排空队列——track(...); void flush(); location.href = ...即可保证请求在跳转前以 fetch keepalive 发出,无需 await、零跳转延迟。
1.1.1
Patch Changes
42c6498: 修复两处评审与单测发现的口径问题。
- schema 校验:
timestamp改用有限数判定(Number.isFinite),区分「缺失/NaN/Infinity」与合法的 0 值,不再误丢 falsy 时间戳。 - 曝光策略解析:
setExposurePolicy的overrides多条同时命中时按具体度取胜者——精确键 > 最长通配前缀(如a.b.*胜过a.*),不再依赖对象键书写顺序。 - 上报 header:网关请求头补充
X-Lang(取navigator.language),修复上报缺失语言信息的问题。
- schema 校验:
1.1.0
Minor Changes
- c25c400: - @tripo3d/lens: 支持远端 performance.slowResourceMs 慢资源阈值,优先于本地 options,缺省回退本地/内置默认
1.0.0
Major Changes
23d845e: 首个正式版 1.0.0:商业化埋点与广告归因采集内核。
- 内核迁入:从 fe-tripo-trace 仓库迁入(监控 / 埋点 / 归因 / 性能统一内核,基于
@tripo3d/fingerprint),提供 ESM 主入口与/shared、/server子路径。 - 多框架入口:新增
@tripo3d/lens/react、@tripo3d/lens/vue子路径,原@tripo3d/lens-react-plugin/@tripo3d/lens-vue-plugin薄适配层折入本包;消费方pnpm add @tripo3d/lens后按框架子路径 import。 - Nuxt 适配器:以
@tripo3d/lens/nuxt子路径随本包发布(原独立包@tripo3d/lens-nuxt-plugin已移除),零接线装配客户端实例与 SSR 采集;app/endpoint/configUrl均为构建期必填校验。 - 相对 beta 的修复与加固:
- 传输层 flush / restore / 离线重放 / 卸载兜底统一 UTF-8 字节度量(原 UTF-16 字符数对中文低估约 3 倍,整批超 fetch keepalive 64KB 配额被浏览器拒收);卸载兜底只发首批(配额为页面级共享总额),剩余回灌内存 + 快照续传,消除超额批被拒后快照已清的静默丢数据;离线单条准入与拆批共用
KEEPALIVE_SAFE_BYTES,不再接纳永远发不出去的超大记录。 PriorityQueueOptions.maxChunkChars更名maxChunkBytes(度量口径改为 UTF-8 字节),旧字段保留 deprecated 别名。- Web Vitals 的 CLS 保留 4 位小数(原 round 取整后恒为 0);序列化失败(payload 含 BigInt / 循环引用)按管线契约转为丢弃并经 onError 可观测,不再使
process()reject。 - 插件生命周期竞态修复:
setupAll幂等跳过活跃插件(不再对活跃插件二次 setup),生命周期变更内部串行互斥、destroy 重置串行链(防挂死 setup 拖住重建)、setup 期间被 destroy 的插件就地补拆;revokeConsent同步拆除受控插件后再清队列,撤销即刻停止采集、不被在途 setup 拖延。 - IndexedDB 连接异常关闭(跨 tab deleteDatabase / 浏览器回收)自动清缓存、下次操作重开自愈;React
useTraceProps错误上报移出渲染期(useMemo→useEffect)。
- 传输层 flush / restore / 离线重放 / 卸载兜底统一 UTF-8 字节度量(原 UTF-16 字符数对中文低估约 3 倍,整批超 fetch keepalive 64KB 配额被浏览器拒收);卸载兜底只发首批(配额为页面级共享总额),剩余回灌内存 + 快照续传,消除超额批被拒后快照已清的静默丢数据;离线单条准入与拆批共用
- 内核迁入:从 fe-tripo-trace 仓库迁入(监控 / 埋点 / 归因 / 性能统一内核,基于
Minor Changes
23d845e: Nuxt 适配器折入核心包:新增
@tripo3d/lens/nuxt子路径入口(tsdown 构建,module+runtime/{plugin.client,nitro}三 entry),独立包@tripo3d/lens-nuxt-plugin从 monorepo 移除、停止发布。BREAKING(针对
@tripo3d/lens-nuxt-plugin消费方):该包不再维护,请迁移到核心包子路径——- 依赖:
pnpm remove @tripo3d/lens-nuxt-plugin && pnpm add @tripo3d/lens(Nuxt 场景需自带nuxt/@nuxt/kit等 peer,均为 optional,不影响非 Nuxt 消费方)。 nuxt.config:modules: ['@tripo3d/lens-nuxt-plugin']→modules: ['@tripo3d/lens/nuxt']。tripoLens配置键与全部选项保持不变,运行时行为无变化。
- 依赖:
23d845e: performance 上报改为绝对时刻锚点范式,完整还原加载瀑布。
- 统一口径:Navigation / Hydration / SlowResource 不再上报我方计算的差值段长,改为透传相对
timeOrigin的绝对时刻锚点(DOMHighResTimeStamp,round 取整),差值全部交后端派生。消除 tcp/tls 口径重叠、两种 ttfb 歧义、responseEnd → domInteractive还原黑洞。 - Navigation 补齐锚点:新增
redirectStart/End、fetchStart、workerStart、domComplete、loadEventStart、domContentLoadedEventStart等全时间轴锚点,及文档体积(transferSize/encodedBodySize/decodedBodySize)、元信息(nextHopProtocol/type/redirectCount)、epoch 基准timeOrigin。后端可据此无缝重建加载 waterfall。 - Hydration 双锚点:
hydrationDuration差值改为hydrationStart(= navigationdomInteractive)/hydrationComplete双锚点,与 navigation 落在同一timeOrigin坐标系。 - SlowResource 补齐:新增
responseEnd锚点与encodedBodySize/decodedBodySize体积字段。 - 关联键:Navigation / Hydration / Web Vitals 在有 SSR 时统一带
renderId,供后端 join 同一次加载的全部性能事件。 - SSR 跨端时钟边界保持现状(SSR 相对服务端
startedAt,靠renderId关联,不强行抹平 clock skew);LongTask/LoAF 聚合不变。
- 统一口径:Navigation / Hydration / SlowResource 不再上报我方计算的差值段长,改为透传相对