DEV Community

Cover image for Convert Svelte to PWA.
Alish Giri
Alish Giri

Posted on

1 1

Convert Svelte to PWA.

Step 1

Create a folder called service-worker inside src/ folder.

Step 2

Create a new file called index.ts or index.js inside src/service-worker/ folder with the following contents.

/// <reference types="@sveltejs/kit" />

import { build, files, version } from '$service-worker';

const CACHE = `cache-${version}`;

const ASSETS = [
    ...build, // the app itself
    ...files // everything in `static`
];

self.addEventListener('install', (event) => {
    // Create a new cache and add all files to it
    async function addFilesToCache() {
        const cache = await caches.open(CACHE);
        await cache.addAll(ASSETS);
    }
    event.waitUntil(addFilesToCache());
});

self.addEventListener('activate', (event) => {
    // Remove previous cached data from disk
    async function deleteOldCaches() {
        for (const key of await caches.keys()) {
            if (key !== CACHE) await caches.delete(key);
        }
    }
    event.waitUntil(deleteOldCaches());
});

self.addEventListener('fetch', (event) => {
    // ignore POST  requests, etc
    if (event.request.method !== 'GET') return;

    async function respond() {
        const url = new URL(event.request.url);
        const cache = await caches.open(CACHE);

        // `build`/`files` can always be served from the cache
        if (ASSETS.includes(url.pathname)) {
            return cache.match(url.pathname);
        }

        // for everything else, try the network first, but
        // fall back to the cache if we're offline
        try {
            const response = await fetch(event.request);

            if (response.status === 200) {
                cache.put(event.request, response.clone());
            }

            return response;
        } catch {
            return cache.match(event.request);
        }
    }

    event.respondWith(respond());
});

Enter fullscreen mode Exit fullscreen mode

Step 3

Create manifest.json file inside static/ folder with the following contents.

Logos and screenshots should be placed inside static/ folder. For this tutorial I have used static/pwa-assets/ folder.

{
    "name": "app_name",
    "description": "app_description",
    "display": "standalone",
    "start_url": "/",
    "orientation": "portrait-primary",
    "prefer_related_applications": false,
    "icons": [
        {
            "src": "pwa-assets/logo-144.png",
            "sizes": "144x144",
            "type": "image/png"
        },
        {
            "src": "pwa-assets/logo-512.png",
            "sizes": "512x512",
            "type": "image/png",
            "purpose": "maskable"
        }
    ],
    "screenshots": [
        {
            "src": "pwa-assets/app-screenshot.png",
            "sizes": "1280x720",
            "type": "image/png",
            "form_factor": "wide",
            "label": "screenshot_description_here"
        }
    ]
}
Enter fullscreen mode Exit fullscreen mode

Step 4

Add the following to the head tag on the src/app.html file.

<link rel="manifest" href="/manifest.json" />
Enter fullscreen mode Exit fullscreen mode

Enjoy your Svelte Progressive Web App (PWA)! 🫡

Image of Datadog

The Essential Toolkit for Front-end Developers

Take a user-centric approach to front-end monitoring that evolves alongside increasingly complex frameworks and single-page applications.

Get The Kit

Top comments (3)

Collapse
 
kvetoslavnovak profile image
kvetoslavnovak •

Thank you. Does it work for Sveltekit apps as well?

Collapse
 
wootcot profile image
Alish Giri •

Yeah, if it a web based platform then it will work.

Collapse
 
kvetoslavnovak profile image
kvetoslavnovak •

Yeah, works great, thank you.

Image of Docusign

🛠️ Bring your solution into Docusign. Reach over 1.6M customers.

Docusign is now extensible. Overcome challenges with disconnected products and inaccessible data by bringing your solutions into Docusign and publishing to 1.6M customers in the App Center.

Learn more