@sleek nimbus made a bit of changes to the impl. btw why do we add more link module preload tags?
useOnWindow(
"DOMContentLoaded",
sync$(async () => {
if (document.querySelector('[q\\:render="ssr-dev"]')) return;
if (!("serviceWorker" in navigator)) return;
const base = document.documentElement.getAttribute("q:base") ?? "/";
await navigator.serviceWorker.register("sw.js");
await navigator.serviceWorker.ready;
const modules = document.querySelectorAll('link[rel="modulepreload"]');
const controller = navigator.serviceWorker.controller;
const hrefs = Array.from(modules).map(
(link) => (link as HTMLLinkElement).href
);
controller?.postMessage({ type: "cache", value: hrefs });
document.addEventListener("qprefetch", (event) => {
const { bundles } = (event as CustomEvent).detail;
console.log(bundles);
if (!Array.isArray(bundles)) return;
for (const bundle of bundles) {
const link = document.createElement("link");
link.rel = "modulepreload";
link.href = `${base}${bundle}`.replace(/\/\./g, "");
document.body.appendChild(link);
}
});
})
);
in the public folder sw.js
same as what you had
const main = async () => {
let cache;
self.addEventListener("activate", async () => {
cache ||= await caches.open("QwikModulePreload");
});
self.addEventListener("message", async (message) => {
cache ||= await caches.open("QwikModulePreload");
if (message.data.type === "cache") {
const bundles = Array.from(new Set(message.data.value));
cache.addAll(bundles);
}
});
self.addEventListener("fetch", async (event) => {
const req = event.request;
const match = await cache.match(req);
if (match) return event.respondWith(match);
if (req.url.includes("q-")) cache.add(req);
});
};
main();
addEventListener("install", () => self.skipWaiting());
addEventListener("activate", () => self.clients.claim());