前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Workbox-webpack-plugin 使用指南与实践

Workbox-webpack-plugin 使用指南与实践

原创
作者头像
繁依Fanyi
发布于 2024-09-14 12:32:24
发布于 2024-09-14 12:32:24
65400
代码可运行
举报
运行总次数:0
代码可运行

Workbox-webpack-plugin 最新版使用全解

1. 简介

Workbox-webpack-plugin 是 Google 开发的用于渐进式 Web 应用(PWA)的插件,通过缓存静态资源及优化加载速度来提升用户体验。它集成了 Webpack 的打包流程,可以自动生成和管理 Service Worker,帮助开发者轻松为应用添加离线缓存能力。

2. 安装与初始化

首先,确保在项目中安装了该插件:

代码语言:bash
AI代码解释
复制
npm install workbox-webpack-plugin --save-dev

安装完成后,将插件集成到 Webpack 配置中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const { GenerateSW } = require('workbox-webpack-plugin');

module.exports = {
  plugins: [
    new GenerateSW({
      // 基础配置
    }),
  ],
};
3. 工作模式

workbox-webpack-plugin 提供了两种主要模式:

  1. GenerateSW:自动生成并管理 Service Worker 文件,适合快速集成 PWA 支持。
  2. InjectManifest:允许手动编写和控制 Service Worker 逻辑,适合需要更高自定义能力的场景。
4. 配置字段详解
4.1 GenerateSW 配置选项

GenerateSW 模式默认会自动生成一个 Service Worker 文件,以下是常用配置:

  • swDest: 指定生成的 Service Worker 文件的输出路径,默认 service-worker.js
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
new GenerateSW({
swDest: 'custom-service-worker.js',
});
  • exclude: 用于排除不需要缓存的文件,常用于忽略 .map 文件等。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
new GenerateSW({
exclude: [/\.map$/, /manifest\.json$/],
});
  • clientsClaim: 启用该选项可以让新生成的 Service Worker 在激活后立即接管所有页面。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
new GenerateSW({
clientsClaim: true,
});
  • skipWaiting: 允许新的 Service Worker 在安装后立即激活,不用等到旧的 Service Worker 终止。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
new GenerateSW({
skipWaiting: true,
});
  • runtimeCaching: 用于配置运行时缓存策略,开发者可以自定义缓存哪些动态请求。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
new GenerateSW({
runtimeCaching: [
    {
    urlPattern: /\.(?:png|jpg|jpeg|svg)$/, // 匹配图片资源
    handler: 'CacheFirst',  // 缓存优先策略
    options: {
        cacheName: 'image-cache',
        expiration: {
        maxEntries: 50,  // 最多缓存50个条目
        maxAgeSeconds: 30 * 24 * 60 * 60,  // 30天过期
        },
    },
    },
],
});
  • offlineGoogleAnalytics: 如果需要跟踪离线时的 Google Analytics 数据,可以启用此选项。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
new GenerateSW({
offlineGoogleAnalytics: true,
});
4.2 InjectManifest 配置选项

InjectManifest 提供了更高的自定义能力,允许开发者手动编写 Service Worker 文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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。

5. 缓存策略详解

Workbox 支持多种缓存策略,每种策略适用于不同的资源类型和场景。

  • CacheFirst:优先使用缓存,只有在缓存中没有找到资源时才会从网络获取。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
handler: 'CacheFirst',
}
  • NetworkFirst:优先从网络获取资源,只有在网络不可用时才会从缓存中读取数据,适合动态数据或 API 请求。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
handler: 'NetworkFirst',
}
  • StaleWhileRevalidate:快速返回缓存中的资源,同时在后台进行网络请求更新缓存。适合资源更新频率较高的场景。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
handler: 'StaleWhileRevalidate',
}
6. 进阶配置
6.1 缓存资源版本控制

Workbox 通过为缓存的资源生成唯一的 hash 值来控制缓存的更新,每当资源内容变化时,Workbox 会生成新的缓存并更新 Service Worker。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
new GenerateSW({
  globDirectory: 'dist/',
  globPatterns: ['**/*.{html,js,css}'],
});
6.2 调试与监控

开发过程中可以通过 Workbox 提供的调试工具监控缓存的情况。例如,使用 workbox-window 来监听 Service Worker 的更新状态。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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();
}
7. 完整项目示例

以下是一个完整的 Webpack 项目示例,结合 GenerateSW 模式配置静态资源预缓存和运行时缓存:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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秒返回缓存
          },
        },
      ],
    }),
  ],
};
8. 实践中的常见问题
  1. 缓存爆炸:由于缓存的资源过多,导致缓存空间占满。可以通过 maxEntriesmaxAgeSeconds 控制缓存的大小和生命周期。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
expiration: {
    maxEntries: 50,
    maxAgeSeconds: 60 * 60 * 24 * 30,  // 30天
}
  1. Service Worker 更新问题:在更新缓存策略时,如果未能即时生效,可能是由于旧的 Service Worker 仍在运行。可以通过 skipWaitingclientsClaim 强制立即激活新 Service Worker。
  2. 调试困难:可以通过 Chrome DevTools 的 Application 面板查看 Service Worker 和缓存的具体情况。
9. 总结

workbox-webpack-plugin 是实现渐进式 Web 应用的强大工具,帮助开发者快速集成 PWA 功能。通过它,我们可以轻松实现静态资源的预缓存、运行时缓存、自动缓存更新等功能,从而提升应用的离线能力和加载性能。在实际项目中,结合业务需求灵活使用 Workbox 的各项配置,将大大提升应用的用户体验和性能表现。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Workbox5+Webpack4构建离线应用
将应用中的静态资源缓存是目前最主流的性能优化方法,甚至能让应用秒开!目前常见的缓存方式有http缓存、memory cache、disk cahce、localstorage、Service worker缓存等方式,本文介绍的Workbox就是实现Service worker离线缓存的一个工具。
乐圣
2022/11/19
1.3K0
Workbox5+Webpack4构建离线应用
PWA 实践/应用(Google Workbox)
PWA(Progressive Web App - 渐进式网页应用)是一种理念,由 Google Chrome 在 2015 年提出。PWA 它不是特指某一项技术,而是应用多项技术来改善用户体验的 Web App,其核心技术包括 Web App Manifest、Service Worker、Web Push 等,用户体验才是 PWA 的核心。
除除
2022/03/11
1.6K0
PWA 实践/应用(Google Workbox)
如何在 Vue 项目中缓存字体文件以提高性能
在现代 Web 开发中,字体文件通常是页面加载时间的重要因素之一。特别是在字体文件较大或网络环境不佳的情况下,用户体验可能会受到影响。本文将详细探讨如何在 Vue.js 项目中优化字体文件的加载和缓存,以提高页面性能。
繁依Fanyi
2024/09/05
3370
PWA 实践/应用(Google Workbox)
PWA(Progressive Web App - 渐进式网页应用)是一种理念,由 Google Chrome 在 2015 年提出。PWA 它不是特指某一项技术,而是应用多项技术来改善用户体验的 Web App,其核心技术包括 Web App Manifest、Service Worker、Web Push 等,用户体验才是 PWA 的核心。
用户6256742
2024/07/09
6910
PWA 实践/应用(Google Workbox)
2025 年了,我不允许你还不知道 vite-plugin-pwa
最近在给项目加 PWA 支持时,发现 vite-plugin-pwa 真的是一个又强大又丝滑的插件! 本文就带大家系统了解一下它的安装使用、核心功能和进阶技巧,让你的 Vite 应用秒变原生 App!
萌萌哒草头将军
2025/04/28
2400
2025 年了,我不允许你还不知道 vite-plugin-pwa
Service Worker 实现 web 应用消息推送
Service Worker 是事件驱动的 worker,生命周期与页面无关,关联页面未关闭时,它也可以退出,没有关联页面时,它也可以启动.
Fred Liang
2018/10/18
2.5K0
【腾讯云前端性能优化大赛】前端性能和加载体验优化实践(附:PWA、离线包、内存优化、预渲染)
特别是对于首屏资源加载中的白屏时间,用户等待的时间就越长,用户感知到页面的速度就越慢。麻省理工学院的 Richard Larson 在讲话中指出,“人类将被动等待高估了 36%”(https://mazey.cn/t/em)。这意味着用户感觉到的等待时间比开发工具记录的长得多。
除除
2021/12/15
2.9K0
【腾讯云前端性能优化大赛】前端性能和加载体验优化实践(附:PWA、离线包、内存优化、预渲染)
Workbox-Getting Started
然后新建一个文件 service-worker.js , 你们可以写上一个最简单的 registerRoute 方法:
szhshp
2022/09/21
6800
Service Worker:让你的 Web 应用牛逼起来
https://github.com/omnipotent-front-end/blog/issues/2
coder_koala
2020/04/22
2.5K0
Service Worker:让你的 Web 应用牛逼起来
你的web应用支持离线访问和策略缓存吗?
•微信公众号 《JavaScript全栈》•掘金 《合一大师》•Bilibili 《合一大师
合一大师
2020/07/20
1.1K0
你的web应用支持离线访问和策略缓存吗?
前端性能和加载体验优化实践
用户为何会觉得页面卡? : 1. 等待时间长(性能) 项目本身包/第三方脚本比较大。 JavaScript 执行阻塞页面加载。 图片体积大且多。 特别是对于首屏耗时中的白屏时间,用户等待的时间就越长,用户感知到页面的速度就越慢。麻省理工学院的 Richard Larson 在讲话中指出,“人类将被动等待高估了 36%”(https://mazey.cn/t/em)。这意味着用户感觉到的等待时间比开发工具记录的长得多。 2. 看起来卡(体验) 页面结构不断调整,不连贯。抖动的页面往往让用户感觉很卡。 首先
腾讯云可观测平台
2022/01/26
1.6K0
5-2 PWA 的打包配置
PWA 是 Progressive Web App 的缩写,即渐进式 Web 应用,目的是在移动端利用提供的标准化框架,在网页应用中实现和原生应用相近的用户体验。
love丁酥酥
2020/05/04
1.3K0
【腾讯云前端性能优化大赛】前端首屏性能优化
网站的性能一直是前端工程师努力的方向之一,更加流畅的体验,更加快速的页面呈现,都是好的web网站的指标之一。
godlanbo
2021/12/27
1.7K0
为原有的 NextJS 构建 PWA
简单来说,支持 pwa 的网站再移动端或者桌面端都可以模拟成设备中的一个 app,存在于主屏幕上。
Innei
2021/12/28
9840
@vue/cli-plugin-pwa 中文翻译
service worker 介绍:https://segmentfault.com/a/1190000016028780
星宇大前端
2020/12/21
1.4K0
为 vue 项目添加 PWA 支持
如果您的目的不是为现有的 vue 项目添加 PWA 支持,那么更推荐尝试 Lavas
子润先生
2021/06/09
3.8K0
webpack5高级
高级也就是相对于基础的优化。从以下角度进行优化: 提升开发体验; 提升打包构建速度 减少代码体积 优化代码运行性能
zhouzhouya
2023/10/26
3320
webpack 4 的 30 个步骤打造优化到极致的 react 开发环境
将 react 和 webpack4 进行结合,集 webpack 的优势于一身,从 0 开始构建一个强大的 react 开发环境。
夜尽天明
2019/06/18
2.4K0
PWA入门:手把手教你制作一个PWA应用
Web前端的同学是否想过学习app开发,以弥补自己移动端能力的不足?但在面对一众的选择时很多同学略感迷茫,是学习ios还是android开发?是学习原生开发、混合开发(比如:Ionic),还是使用react native或者flutter这样的跨平台框架?而app开发的学习周期长、学习成本高也让一部分人望而却步。得益于前端技术的飞速发展、浏览器性能的不断提高,使用网页技术开发出接近原生体验的应用得以变为现实,PWA就在这样的背景下应运而生。可以用自己熟悉的HTML、CSS、Javascript开发出媲美原生app的网站,不仅拥有接近原生app的流畅程度,并且具备一些原生app才有的特性,比如:a. 可以在主屏上安装应用图标,b. 离线状态下访问,c. 获取消息通知,等等。。PWA的出现让大家看到了希望!
MudOnTire
2019/07/02
4K0
PWA入门:手把手教你制作一个PWA应用
ServiceWorker工作机制与生命周期:资源缓存与协作通信处理
在 《web messaging与Woker分类:漫谈postMessage跨线程跨页面通信》介绍过ServiceWorker,这里摘抄跟多的内容,补全
周陆军
2021/07/03
1.6K0
相关推荐
Workbox5+Webpack4构建离线应用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验