Skip to main content
Service workers enable offline support, push notifications, and Progressive Web App (PWA) functionality.

Basic Service Worker

Create Service Worker

// public/sw.js
self.addEventListener('install', (event) => {
  console.log('Service Worker installing')
})

self.addEventListener('activate', (event) => {
  console.log('Service Worker activating')
})

self.addEventListener('fetch', (event) => {
  // Handle fetch events
})

Register in App

// src/main.ts
if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('/sw.js')
    .then(reg => console.log('SW registered', reg))
    .catch(err => console.log('SW registration failed', err))
}

Configure Mizu

app.Use(frontend.WithOptions(frontend.Options{
    ServiceWorker: "sw.js",  // Sets proper scope headers
}))

Caching Strategies

Cache First

// sw.js
const CACHE_NAME = 'v1'

self.addEventListener('fetch', (event) => {
  event.respondWith(
    caches.match(event.request)
      .then(response => response || fetch(event.request))
  )
})

Network First

self.addEventListener('fetch', (event) => {
  event.respondWith(
    fetch(event.request)
      .catch(() => caches.match(event.request))
  )
})

Workbox

Use Workbox for production service workers:
npm install workbox-cli -D
// workbox-config.js
module.exports = {
  globDirectory: 'dist/',
  globPatterns: ['**/*.{html,js,css,png,jpg,svg}'],
  swDest: 'dist/sw.js',
  runtimeCaching: [{
    urlPattern: /^https:\/\/api\./,
    handler: 'NetworkFirst',
  }],
}
Build:
npx workbox generateSW workbox-config.js

PWA Manifest

// public/manifest.json
{
  "name": "My Mizu App",
  "short_name": "MizuApp",
  "start_url": "/",
  "display": "standalone",
  "background_color": "#ffffff",
  "theme_color": "#000000",
  "icons": [
    {
      "src": "/icon-192.png",
      "sizes": "192x192",
      "type": "image/png"
    },
    {
      "src": "/icon-512.png",
      "sizes": "512x512",
      "type": "image/png"
    }
  ]
}
<!-- index.html -->
<link rel="manifest" href="/manifest.json">

Next Steps