Workbox 是一个强大的工具库,用于简化 Service Worker 的开发和配置,通过 Workbox 可以更轻松地实现离线缓存、资源预取、请求拦截等功能,从而提升 Web 应用的性能和用户体验,下面将详细介绍如何通过 Workbox CDN 来使用 Workbox:
使用 Workbox-window 模块
1. 导入并使用 workbox-window
workbox-window 是一个将在 window 中运行的 Workbox 模块,它帮助开发者识别 Service Worker 生命周期中的关键时刻,简化 Service Worker 的注册和更新,并在 window 和 Service Worker 之间进行消息传递。
导入方法:
从本地导入:
npm install workbox-window --save
在应用 JavaScript 中导入:
<script type="module"> import { Workbox } from 'workbox-window'; if ('serviceWorker' in navigator) { const wb = new Workbox('/sw.js'); wb.register(); } </script>
使用动态 import:
<script type="module"> if ('serviceWorker' in navigator) { const { Workbox } = await import('workbox-window'); const wb = new Workbox('/sw.js'); wb.register(); } </script>
使用 CDN:
<script type="module"> import { Workbox } from 'https://storage.googleapis.com/workbox-cdn/releases/6.2.0/workbox-window.prod.mjs'; if ('serviceWorker' in navigator) { const wb = new Workbox('/sw.js'); wb.register(); } </script>
2. 注册 Service Worker
向 workbox-window 注册 Service Worker 是通过 Workbox 类的 register 方法完成的:
import { Workbox } from 'workbox-window'; const wb = new Workbox('/sw.js'); wb.register();
这会等待 window load 事件,然后再注册 Service Worker,以避免带宽争用。
3. 在 window 和 Service Worker 之间通信
Service Worker 有自己的作用域,独立于 window,并且只能访问 window 中可用的 API 子集,不过,可以通过 workbox-window 模块的 messageSW 方法在两个作用域之间进行通信。
示例代码:
// sw.js const SW_VERSION = '1.0.0'; self.addEventListener('message', (event) => { if (event.data.type === 'GET_VERSION') { event.ports[0].postMessage(SW_VERSION); } });
// index.html const wb = new Workbox('/sw.js'); wb.register(); const swVersion = await wb.messageSW({ type: 'GET_VERSION' }); console.log('Service Worker version:', swVersion);
使用 Workbox-sw 模块
1. 引入 Workbox-sw
可以通过 CDN 或本地文件引入 Workbox-sw:
通过 CDN:
importScripts('https://storage.googleapis.com/workbox-cdn/releases/3.4.1/workbox-sw.js');
本地引入:
importScripts('/third_party/workbox/workbox-sw.js'); workbox.setConfig({ modulePathPrefix: '/third_party/workbox/' });
2. 使用 Workbox 策略
Workbox 提供了多种缓存策略,如 Stale While Revalidate、Network First、Cache First、Network Only 和 Cache Only,以下是一些常用策略的配置示例:
workbox.routing.registerRoute(new RegExp('\.png$'), workbox.strategies.cacheFirst()); workbox.routing.registerRoute(new RegExp('https://your\.cdn\.com/'), workbox.strategies.networkFirst());
Workbox 是一个强大的工具库,通过简化 Service Worker 的开发和配置,提升了 Web 应用的性能和用户体验,无论是通过 CDN 还是本地文件引入 Workbox,都可以方便地使用其提供的各种功能和策略。