feat(sdk): page_view 增加 nav_type/prerendering 来源信号(预渲染=AI搜索指纹)

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
浅念
2026-09-16 17:09:22 +08:00
parent 59de51c062
commit 64d5daf921
2 changed files with 67 additions and 2 deletions
+16 -1
View File
@@ -2,6 +2,20 @@ import type { Transport } from "./transport";
import { pageContext } from "./context";
import { uuid } from "./util";
// 来源信号(Navigation Timing L2):startPageTracking 仅 init 时调用一次,
// 读一次 Navigation Entry 即冻结进 page_view——nav_type ∈ navigate/reload/
// back_forward(浏览器不给则空串);activationStart>0 = 页面由预渲染激活
// (AI 搜索/聚合器预加载的强指纹)。任何环境异常静默(spec §4.5 红线)。
function navSignals(): { nav_type: string; prerendering: boolean } {
try {
const nav = performance.getEntriesByType("navigation")[0] as
{ type?: string; activationStart?: number } | undefined;
return { nav_type: nav?.type || "", prerendering: (nav?.activationStart ?? 0) > 0 };
} catch {
return { nav_type: "", prerendering: false };
}
}
// 有效停留(spec §4.3):页面可见且 30s 内有交互活动才按秒累计 activeMs;
// 隐藏(visibilitychange→hidden)或离开(pagehide)时发 page_stay 并 flush(true)。
// close 可能连续触发(hidden 后紧跟 pagehide):activeMs 清零后不再重发 stay。
@@ -43,9 +57,10 @@ export function startPageTracking(t: Transport) {
});
};
const pc = pageContext();
const nav = navSignals(); // init 时读一次冻结,不随时间变
emit(
"page_view",
{ referrer: pc.referrer, referrer_domain: pc.referrer_domain, utm: pc.utm },
{ referrer: pc.referrer, referrer_domain: pc.referrer_domain, utm: pc.utm, ...nav },
pc
);
const close = () => {