Skip to content

Commit 368a63e

Browse files
committed
feat: e.skipWaiting() in sw-update event
1 parent 0477310 commit 368a63e

File tree

4 files changed

+58
-2
lines changed

4 files changed

+58
-2
lines changed

Diff for: lib/app/SWUpdateEvent.js

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
export default class SWUpdateEvent {
2+
constructor (registration) {
3+
Object.defineProperty(this, 'registration', {
4+
value: registration,
5+
configurable: true,
6+
writable: true
7+
})
8+
}
9+
10+
/**
11+
* Activate new service worker to work 'location.reload()' with new data.
12+
*/
13+
skipWaiting () {
14+
const worker = this.registration.waiting
15+
if (!worker) {
16+
return Promise.resolve()
17+
}
18+
19+
console.log('[vuepress:sw] Doing worker.skipWaiting().')
20+
return new Promise((resolve, reject) => {
21+
const channel = new MessageChannel()
22+
23+
channel.port1.onmessage = (event) => {
24+
console.log('[vuepress:sw] Done worker.skipWaiting().')
25+
if (event.data.error) {
26+
reject(event.data.error)
27+
} else {
28+
resolve(event.data)
29+
}
30+
}
31+
32+
worker.postMessage({ type: 'skip-waiting' }, [channel.port2])
33+
})
34+
}
35+
}

Diff for: lib/app/clientEntry.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/* global BASE_URL, GA_ID, ga, SW_ENABLED */
22

33
import { createApp } from './app'
4+
import SWUpdateEvent from './SWUpdateEvent'
45
import { register } from 'register-service-worker'
56

67
const { app, router } = createApp()
@@ -47,7 +48,10 @@ router.onReady(() => {
4748
},
4849
updated () {
4950
console.log('[vuepress:sw] Content updated.')
50-
app.$refs.layout.$emit('sw-updated')
51+
52+
navigator.serviceWorker.getRegistration().then(registration => {
53+
app.$refs.layout.$emit('sw-updated', new SWUpdateEvent(registration))
54+
})
5155
},
5256
offline () {
5357
console.log('[vuepress:sw] No internet connection found. App is running in offline mode.')

Diff for: lib/build.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -81,11 +81,16 @@ module.exports = async function build (sourceDir, cliOptions = {}) {
8181
if (options.siteConfig.serviceWorker) {
8282
logger.wait('\nGenerating service worker...')
8383
const wbb = require('workbox-build')
84-
wbb.generateSW({
84+
await wbb.generateSW({
8585
swDest: path.resolve(outDir, 'service-worker.js'),
8686
globDirectory: outDir,
8787
globPatterns: ['**\/*.{js,css,html,png,jpg,jpeg,gif,svg,woff,woff2,eot,ttf,otf}']
8888
})
89+
await fs.writeFile(
90+
path.resolve(outDir, 'service-worker.js'),
91+
await fs.readFile(path.resolve(__dirname, 'service-worker/skip-waiting.js'), 'utf8'),
92+
{ flag: 'a' }
93+
)
8994
}
9095

9196
// DONE.

Diff for: lib/service-worker/skip-waiting.js

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
addEventListener('message', event => {
2+
const replyPort = event.ports[0]
3+
const message = event.data
4+
if (replyPort && message && message.type === 'skip-waiting') {
5+
event.waitUntil(
6+
self.skipWaiting().then(
7+
() => replyPort.postMessage({ error: null }),
8+
error => replyPort.postMessage({ error })
9+
)
10+
)
11+
}
12+
})

0 commit comments

Comments
 (0)