Workbox-webpack-plugin
是 Google 开发的用于渐进式 Web 应用(PWA)的插件,通过缓存静态资源及优化加载速度来提升用户体验。它集成了 Webpack
的打包流程,可以自动生成和管理 Service Worker,帮助开发者轻松为应用添加离线缓存能力。
首先,确保在项目中安装了该插件:
npm install workbox-webpack-plugin --save-dev
安装完成后,将插件集成到 Webpack 配置中:
const { GenerateSW } = require('workbox-webpack-plugin');
module.exports = {
plugins: [
new GenerateSW({
// 基础配置
}),
],
};
workbox-webpack-plugin
提供了两种主要模式:
GenerateSW
配置选项GenerateSW
模式默认会自动生成一个 Service Worker 文件,以下是常用配置:
service-worker.js
。new GenerateSW({
swDest: 'custom-service-worker.js',
});
.map
文件等。new GenerateSW({
exclude: [/\.map$/, /manifest\.json$/],
});
new GenerateSW({
clientsClaim: true,
});
new GenerateSW({
skipWaiting: true,
});
new GenerateSW({
runtimeCaching: [
{
urlPattern: /\.(?:png|jpg|jpeg|svg)$/, // 匹配图片资源
handler: 'CacheFirst', // 缓存优先策略
options: {
cacheName: 'image-cache',
expiration: {
maxEntries: 50, // 最多缓存50个条目
maxAgeSeconds: 30 * 24 * 60 * 60, // 30天过期
},
},
},
],
});
new GenerateSW({
offlineGoogleAnalytics: true,
});
InjectManifest
配置选项InjectManifest
提供了更高的自定义能力,允许开发者手动编写 Service Worker 文件:
const { InjectManifest } = require('workbox-webpack-plugin');
module.exports = {
plugins: [
new InjectManifest({
swSrc: './src/custom-sw.js', // 指定自定义的 Service Worker 源文件
swDest: 'service-worker.js', // 输出文件名
}),
],
};
该模式适合需要自定义复杂缓存逻辑的场景。Service Worker 文件可以包含更多的控制逻辑和策略,而不依赖 Workbox 自动生成的 Service Worker。
Workbox 支持多种缓存策略,每种策略适用于不同的资源类型和场景。
{
handler: 'CacheFirst',
}
{
handler: 'NetworkFirst',
}
{
handler: 'StaleWhileRevalidate',
}
Workbox 通过为缓存的资源生成唯一的 hash 值来控制缓存的更新,每当资源内容变化时,Workbox 会生成新的缓存并更新 Service Worker。
new GenerateSW({
globDirectory: 'dist/',
globPatterns: ['**/*.{html,js,css}'],
});
开发过程中可以通过 Workbox 提供的调试工具监控缓存的情况。例如,使用 workbox-window
来监听 Service Worker 的更新状态。
import { Workbox } from 'workbox-window';
if ('serviceWorker' in navigator) {
const wb = new Workbox('/service-worker.js');
wb.addEventListener('waiting', () => {
console.log('New service worker waiting to activate.');
});
wb.register();
}
以下是一个完整的 Webpack 项目示例,结合 GenerateSW
模式配置静态资源预缓存和运行时缓存:
const { GenerateSW } = require('workbox-webpack-plugin');
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist'),
},
plugins: [
new GenerateSW({
clientsClaim: true,
skipWaiting: true,
runtimeCaching: [
{
urlPattern: /\.(?:png|jpg|jpeg|svg)$/,
handler: 'CacheFirst',
options: {
cacheName: 'images',
expiration: {
maxEntries: 50,
maxAgeSeconds: 30 * 24 * 60 * 60, // 30天
},
},
},
{
urlPattern: /^https:\/\/api\.example\.com\//,
handler: 'NetworkFirst',
options: {
cacheName: 'api-cache',
networkTimeoutSeconds: 10, // 超过10秒返回缓存
},
},
],
}),
],
};
maxEntries
和 maxAgeSeconds
控制缓存的大小和生命周期。expiration: {
maxEntries: 50,
maxAgeSeconds: 60 * 60 * 24 * 30, // 30天
}
skipWaiting
和 clientsClaim
强制立即激活新 Service Worker。workbox-webpack-plugin
是实现渐进式 Web 应用的强大工具,帮助开发者快速集成 PWA 功能。通过它,我们可以轻松实现静态资源的预缓存、运行时缓存、自动缓存更新等功能,从而提升应用的离线能力和加载性能。在实际项目中,结合业务需求灵活使用 Workbox 的各项配置,将大大提升应用的用户体验和性能表现。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有