Navigation Preload 通过并行发起主文档请求消除 SW 冷启动首屏阻塞,需注册后显式启用 navigationPreload.enable(),fetch 中优先 await event.preloadResponse 并降级兜底。
Navigation Preload 不是“加快 Service Worker 启动”,而是让浏览器在 SW 启动过程中并行发起主文档请求,从而消除冷启动带来的首屏阻塞。关键在于它把原本串行的“SW 初始化 → 再发请求”变成“SW 初始化 + 请求同时进行”,真正压缩的是用户感知的等待时间。
仅注册 Service Worker 不会自动开启 Navigation Preload。必须在注册成功后,检查并调用 navigationPreload.enable():
/sw.js)registration.navigationPreload 是否存在(旧版浏览器不支持)registration.navigationPreload.setHeaderValue('X-Preload', 'true')
在 Service Worker 的 fetch 事件里,不能只依赖缓存或网络,而要主动等待预加载结果:
event.preloadResponse 获取预加载的 Response 对象(它是一个 Promise)event.respondWith() 外部提前 resolve 或忽略该 Promise,否则会触发“preload cancelled”错误Navigation Preload 只对导航请求(request.destination === 'document')有效,因此需明确区分资源类型:
立即学习“前端免费学习笔记(深入)”;
{ scope: '/' }),否则部分页面无法触发预加载install 阶段缓存大量 HTML,因为预加载本质是绕过缓存取网络最新版该功能已在 Chrome、Edge、Firefox 和 iOS Safari 11.3+ 中稳定支持,但仍需考虑降级:
navigator.serviceWorker?.ready 和 navigationPreload 能力,无则跳过启用逻辑event.preloadResponse 为 undefined 或 reject,也要有兜底响应skipWaiting() 和 clients.claim(),确保新版 SW 能及时接管,避免用户长期停留在旧版逻辑中