Navigation API 无刷新导航与视图过渡协作实践概述Navigation API 通过原生路由拦截与导航事件,提供不依赖框架的无刷新导航能力。结合 View Transitions 可获得共享元素过渡与状态保留的顺滑体验。关键参数/概念`navigation.addEventListener('navigate', handler)`: 拦截导航事件(链接点击、`navigation.navigate()`)。`NavigateEvent`: 含 `canIntercept`、`intercept({ handler })` 实现客户端处理与数据刷新。`navigation.navigate(url)`: 以编程方式触发导航。与 View Transitions 协作:`document.startViewTransition(() => navigation.navigate(url))`。实践/示例// 路由拦截与客户端渲染 if ("navigation" in window) { navigation.addEventListener("navigate", (event: any) => { if (!event.canIntercept) return; event.intercept({ handler: async () => { const url = new URL(event.destination.url); const content = await fetch(`/partial${url.pathname}`).then((r) => r.text()); document.querySelector("main")!.innerHTML = content; }, }); }); } // 与视图过渡协作(共享元素动画) document.querySelectorAll("a[data-vt]").forEach((a) => { a.addEventListener("click", (e) => { e.preventDefault(); const href = (e.currentTarget as HTMLAnchorElement).href; if (document.startViewTransition) { document.startViewTransition(() => navigation.navigate(href)); } else { navigation.navigate(href); } }); }); 验证方法兼容性:在 Chromium 系(Chrome 118+)与其他浏览器下验证 `navigation` 是否存在,降级到传统跳转。性能:对比传统全量刷新与拦截加载的 TTFB/INP;观察动画连续性与状态保留。注意事项SEO 与历史:确保 `event.transitionWhile`/客户端渲染后正确更新标题与 `history` 状态。安全:拦截逻辑需校验 URL 并限制同源,避免开放重定向。

发表评论 取消回复