I am using Vite to build an SPA with React (typescript), and I am trying to register a service-worker. I am registering the script as type module
, and service-worker.ts
sits at src/web-worker/service-worker.ts
. There is also a tsconfig.json at src/web-worker
Everything works in Dev, but when it’s built, src/web-worker/service-worker.ts is not replaced with anything equivalent
.
Any suggestions?
index.html
JavaScript
x
26
26
1
<!DOCTYPE html>
2
<html lang="en">
3
4
<head>
5
<meta charset="UTF-8" />
6
<link rel="icon" type="image/svg+xml" href="/src/favicon.svg" />
7
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
8
<link rel="stylesheet" href="/src/styles/globals.css">
9
<title>Vite App</title>
10
</head>
11
12
<body>
13
<div id="root"></div>
14
<script type="module" src="/src/main.tsx"></script>
15
<script type="text/javascript">
16
if ('serviceWorker' in navigator) {
17
(async () => {
18
await navigator.serviceWorker.register("src/web-worker/service-worker.ts", { type: 'module' })
19
console.log("Service worker registered")
20
})()
21
}
22
</script>
23
</body>
24
25
</html>
26
src/web-worker/service-worker.ts
JavaScript
1
31
31
1
// Constants
2
const CACHE_NAME = 'mycache-v1.0.0'
3
const urlsToCache = ['/']
4
5
declare const self: ServiceWorkerGlobalScope;
6
7
self.addEventListener('install', async (event: ExtendableEvent) => {
8
try {
9
// Create (open) cache
10
const cache = await caches.open(CACHE_NAME)
11
await cache.addAll(urlsToCache)
12
console.log("Cache opened")
13
} catch (err: any) {
14
console.log("Error while installing SW: ", err.message)
15
}
16
})
17
18
self.addEventListener('fetch', (e: FetchEvent) => {
19
e.respondWith((async () => {
20
// Handling fetch
21
console.log(`Handling req for '${e.request.url}'`)
22
const cachedRes = await caches.match(e.request, { cacheName: CACHE_NAME })
23
if (cachedRes) {
24
console.log(`Serving cached response for '${e.request.url}'`)
25
}
26
return cachedRes || await fetch(e.request)
27
})())
28
})
29
30
export default null
31
src/web-worker/tsconfig.json
JavaScript
1
20
20
1
{
2
"compilerOptions": {
3
"target": "ESNext",
4
"useDefineForClassFields": true,
5
"lib": ["ESNext", "WebWorker"],
6
"allowJs": false,
7
"skipLibCheck": false,
8
"esModuleInterop": false,
9
"allowSyntheticDefaultImports": true,
10
"strict": true,
11
"forceConsistentCasingInFileNames": true,
12
"module": "ESNext",
13
"moduleResolution": "Node",
14
"resolveJsonModule": true,
15
"isolatedModules": true,
16
"noEmit": true,
17
},
18
"include": ["*.ts"]
19
}
20
Advertisement
Answer
There is a vitejs plugin for this https://github.com/antfu/vite-plugin-pwa. You can find the react documentation here https://vite-plugin-pwa.netlify.app/examples/react.html