

内容声明
本文仅用于技术分享和学习交流,内容不包含任何广告、推广、引流、付费课程或外链信息。所有示例和配置均为技术实践,欢迎参考和自定义。
本文介绍 Workbox v6 在 CLI 环境中的使用方法,涵盖 generateSW 与 injectManifest 两种模式,说明缓存策略、运行时缓存与预缓存机制,以及 skipWaiting 和 clientsClaim 的更新行为,并提供配置示例与生产实践建议。
Workbox v6 用于生成和维护 Service Worker (SW),以支持 PWA 和离线缓存。
主要功能如下:
CLI 提供两种模式:
generateSW: 基于配置自动生成 SW。injectManifest: 使用自定义 SW 文件。如果项目尚未安装:
npm i -D workbox-cli@^6.5.4
npm i -D workbox-routing@^6.5.4 workbox-strategies@^6.5.4 workbox-precaching@^6.5.4 workbox-expiration@^6.5.4 workbox-cacheable-response@^6.5.4建议保持各个 Workbox 包版本一致。
workbox-config.js)在项目根目录创建配置文件:
module.exports = {
globDirectory: 'dist/',
globPatterns: [
'**/*.{html,js,css,png,jpg,jpeg,svg,webp,woff,woff2}'
],
swDest: 'dist/sw.js'
};生成 Service Worker:
npx workbox generateSW workbox-config.jsgenerateSW 模式 (v6)该模式适用于以配置驱动生成 Service Worker 的场景。
workbox-config.js (v6,包含运行时缓存)module.exports = {
globDirectory: 'dist/',
globPatterns: [
'**/*.{html,js,css,png,jpg,jpeg,svg,webp,woff,woff2}'
],
swDest: 'dist/sw.js',
cleanupOutdatedCaches: true,
skipWaiting: false,
clientsClaim: false,
runtimeCaching: [
{
urlPattern: ({request, url}) =>
request.destination === 'image' &&
url.origin === self.location.origin,
handler: 'StaleWhileRevalidate',
options: {
cacheName: 'images',
expiration: {
maxEntries: 200,
maxAgeSeconds: 7 * 24 * 60 * 60
}
}
},
{
urlPattern: /\/api\/.*$/,
handler: 'NetworkFirst',
options: {
cacheName: 'api-cache',
networkTimeoutSeconds: 3,
expiration: {
maxEntries: 100,
maxAgeSeconds: 24 * 60 * 60
},
cacheableResponse: {
statuses: [0, 200]
}
}
}
]
};skipWaiting 与 clientsClaim 说明 (v6)这两个选项用于控制 Service Worker 的更新行为。
默认情况下,新版本 SW 会进入等待状态。只有旧页面关闭或刷新后,才会激活。
启用 skipWaiting 后,新 SW 会更快激活。启用 clientsClaim 后,SW 会立即接管当前页面。
建议如下:
injectManifest 模式 (v6)该模式适用于需要自定义 Service Worker 逻辑的场景。
配置示例:
module.exports = {
globDirectory: 'dist/',
globPatterns: ['**/*.{html,js,css,png,jpg,jpeg,svg,webp,woff,woff2}'],
swSrc: 'src/sw.js',
swDest: 'dist/sw.js'
};navigateFallback 示例 (v6)该选项用于处理离线导航请求。
示例:
module.exports = {
globDirectory: 'dist/',
globPatterns: ['**/*.{html,js,css,png,jpg,jpeg,svg,webp,woff,woff2}'],
swDest: 'dist/sw.js',
navigateFallback: '/offline.html'
};说明:
用于构建时资源,例如: HTML、JavaScript、CSS、本地字体。
用于动态资源,例如: API、CDN 文件、用户上传内容。
避免将同一 URL 同时加入两种缓存。该行为会增加调试难度。
可以缓存跨域资源。
示例:
({url}) => url.origin === 'https://cdn.example.com'对于跨域响应,应包含状态码 0:
cacheableResponse: { statuses: [0, 200] }CacheFirst
优先从缓存返回资源;若缓存不存在,则请求网络并写入缓存。适用于带版本号的静态资源,例如 JavaScript、CSS、字体和图片。NetworkFirst
优先请求网络;若请求失败或超时,则回退到缓存。适用于需要保持数据新鲜度的资源,例如 HTML 页面和 API 响应。StaleWhileRevalidate
优先返回缓存,同时在后台发起网络请求更新缓存。适用于对加载速度要求较高,同时允许短时间内容过期的资源。NetworkOnly
仅从网络请求资源,不使用缓存。适用于敏感接口,例如认证、用户信息和支付相关请求。CacheOnly
仅从缓存读取资源,不发起网络请求。适用于明确已预缓存的资源,或完全离线的受控场景。生产环境应遵循以下原则:
if ('serviceWorker' in navigator) {
window.addEventListener('load', async () => {
try {
await navigator.serviceWorker.register('/sw.js');
console.log('SW registered');
} catch (e) {
console.error('SW registration failed', e);
}
});
}检查以下内容:
常见错误包括:
generateSW 配置模板module.exports = {
globDirectory: 'dist/',
globPatterns: ['**/*.{html,js,css,svg,png,jpg,jpeg,woff2}'],
swDest: 'dist/sw.js',
cleanupOutdatedCaches: true
};package.json){
"scripts": {
"build": "your-build-command",
"build:sw": "workbox generateSW workbox-config.js"
}
}在使用 v6 项目时参考 v7 文档,应注意:
版权声明
本文为原创文章,作者保留版权。转载请保留本文完整内容,并以超链接形式注明作者及原文出处。
作者: 除除
原文: http://blog.mazey.net/6365.html
<!-- ID: 26-0503_Workbox_ZH -->
(完)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。