Skip to content

Commit c64226c

Browse files
committed
feat(workbox): enabled option and self destroying sw
1 parent 9178106 commit c64226c

File tree

7 files changed

+52
-10
lines changed

7 files changed

+52
-10
lines changed

docs/content/en/workbox.md

+6-4
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,15 @@ pwa: {
3838

3939
(Boolean) Automatically register `/sw.js` on page load. Enabled by default.
4040

41-
### `dev`
41+
### `enabled`
4242

43-
(Boolean) Enable workbox in dev mode of nuxt. (Disabled by default - Not recommended)
43+
(Boolean) Enable workbox module. Workbox is **only enabled for production mode by default**.
4444

45-
**IMPORTANT NOTE:** Remember to clean application data and unregister service workers in your browser or you will experience infinity loop!
45+
**IMPORTANT NOTES:**
4646

47-
It is recommended to test workbox using `nuxt build`/`nuxt start`. You can enable debug mode using `workbox.config.debug`.
47+
- It is recommended to test workbox using `nuxt build`/`nuxt start`. You can enable debug mode using `workbox.config.debug` for production to debug.
48+
- When setting `enabled` to `true`, remember to clean application data and unregister service workers in your browser when changing mode between dev or prod to avoid issues.
49+
- When `enabled` is set to `false` (default for `nuxt dev`) workbox module registers a self-destroying worker and cleans `window.caches`. To completely disable module you can set `pwa.workbox: false` in `nuxt.config`.
4850

4951
<!-- Config -->
5052

lib/workbox/defaults.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ module.exports = {
44
workboxURL: undefined,
55
importScripts: [],
66
autoRegister: true,
7-
dev: undefined,
7+
enabled: undefined,
88

99
// Config
1010
config: {},

lib/workbox/module.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@ module.exports = function nuxtWorkbox (pwa) {
1111
// Warning for dev option
1212
if (options.dev) {
1313
// eslint-disable-next-line no-console
14-
console.warn('Workbox running in `dev` mode. Please clear browser cache and prevent using this option for production!')
14+
console.warn('Workbox is running in development mode')
1515
}
1616

1717
// Register plugin
1818
if (options.autoRegister) {
1919
this.addPlugin({
20-
src: path.resolve(__dirname, 'templates/workbox.js'),
20+
src: path.resolve(__dirname, `templates/workbox${options.enabled ? '' : '.unregister'}.js`),
2121
ssr: false,
2222
fileName: 'workbox.js',
2323
options: {

lib/workbox/options.js

+6-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ const defaults = require('./defaults')
55
function getOptions (pwa) {
66
const options = { ...defaults, ...pwa.workbox }
77

8+
// enabled
9+
if (options.enabled === undefined) {
10+
options.enabled = !this.options.dev || options.dev /* backward compat */
11+
}
12+
813
// routerBase
914
if (!options.routerBase) {
1015
options.routerBase = this.options.router.base
@@ -18,8 +23,7 @@ function getOptions (pwa) {
1823

1924
// swTemplate
2025
if (!options.swTemplate) {
21-
const disabled = this.options.dev && !options.dev
22-
options.swTemplate = path.resolve(__dirname, `templates/sw${disabled ? '.disable' : ''}.js`)
26+
options.swTemplate = path.resolve(__dirname, `templates/sw${options.enabled ? '' : '.unregister'}.js`)
2327
}
2428

2529
// swDest

lib/workbox/templates/sw.disable.js

-1
This file was deleted.
+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// THIS FILE SHOULD NOT BE VERSION CONTROLLED
2+
3+
// https://github.com/NekR/self-destroying-sw
4+
5+
self.addEventListener('install', function (e) {
6+
self.skipWaiting()
7+
})
8+
9+
self.addEventListener('activate', function (e) {
10+
self.registration.unregister()
11+
.then(function () {
12+
return self.clients.matchAll()
13+
})
14+
.then(function (clients) {
15+
clients.forEach(client => client.navigate(client.url))
16+
})
17+
})
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
if ('serviceWorker' in navigator) {
2+
navigator.serviceWorker.getRegistrations().then((registrations) => {
3+
for (const registration of registrations) {
4+
// Force update service worker for self-unregister
5+
registration.update()
6+
}
7+
})
8+
}
9+
10+
if ('caches' in window) {
11+
caches.keys()
12+
.then((keys) => {
13+
if (keys.length) {
14+
console.info('[pwa] [workbox] Cleaning cache for:', keys.join(', '))
15+
for (const key of keys) {
16+
caches.delete(key)
17+
}
18+
}
19+
})
20+
}

0 commit comments

Comments
 (0)