“使用导航预加载加速 Service Worker”很好地解释了什么是导航预加载,以及它为 Service Worker 未明确处理导航请求的 Web 应用提供的优势。
此模块的用途是什么?
workbox-navigation-preload
将在运行时处理检查,以查看当前浏览器是否支持导航预加载;如果支持,它会自动创建一个 activate
事件处理脚本来启用导航预加载。
workbox-core
中负责在所有 Workbox 中发出网络请求的共享代码也已更新,以自动利用预加载响应(如果有)。这意味着,任何内置策略都可以在导航预加载启用后自动利用该预加载功能。
谁应该启用导航预加载?
如果开发者已使用预缓存的 HTML(可能配置了 App Shell 回退)响应导航,则无需启用导航预加载!如果开发者无法预缓存其 HTML,但仍想使用 Workbox 处理网站上其他资源的缓存,则此功能旨在缩短导航延迟时间。
例如,如果您遵循 App Shell 模式,并且已将导航路线设置为使用预缓存的 HTML,则启用导航预加载是一种浪费。与预加载请求关联的网络响应永远不会被使用,因为系统将无条件使用预缓存的 HTML。
基本用法
import * as navigationPreload from 'workbox-navigation-preload';
import {NetworkFirst} from 'workbox-strategies';
import {registerRoute, NavigationRoute} from 'workbox-routing';
// Enable navigation preload.
navigationPreload.enable();
// Swap in NetworkOnly, CacheFirst, or StaleWhileRevalidate as needed.
const strategy = new NetworkFirst({
cacheName: 'cached-navigations',
plugins: [
// Any plugins, like `ExpirationPlugin`, etc.
],
});
const navigationRoute = new NavigationRoute(strategy, {
// Optionally, provide a allow/denylist of RegExps to determine
// which paths will match this route.
// allowlist: [],
// denylist: [],
});
registerRoute(navigationRoute);
什么是浏览器支持案例?
目前,Google Chrome 是唯一支持导航预加载的浏览器。enable()
将在运行时检查浏览器是否支持相应功能,并且仅在当前浏览器支持导航预加载时才尝试启用导航预加载。因此,在 Service Worker 中无条件调用 enable()
是安全的。
请注意,减少导航延迟对此类浏览器没有好处,因此建议您仔细衡量传送不处理导航请求和不使用导航预加载的 Service Worker 对性能的影响。
方法
disable()
workbox-navigation-preload.disable()
如果浏览器支持导航预加载,则此操作会将其停用。
enable()
workbox-navigation-preload.enable(
headerValue?: string,
)
如果浏览器支持导航预加载,则会启用导航预加载。
参数
-
headerValue
字符串(可选)
isSupported()
workbox-navigation-preload.isSupported()
返回
-
boolean
当前浏览器是否支持启用导航预加载。