Skip to content

Commit 31ca21b

Browse files
committed
Performance: Optimize LCP/FCP and implement Service Worker for caching
1 parent 93770c5 commit 31ca21b

2 files changed

Lines changed: 71 additions & 4 deletions

File tree

index.html

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,13 +118,19 @@
118118
}
119119
</script>
120120

121-
<!-- Local Core Libraries -->
122-
<script src="assets/lib/pdf.min.js"></script>
123-
<script src="assets/lib/jspdf.umd.min.js"></script>
121+
<!-- Resource Hints -->
122+
<link rel="preconnect" href="https://slides.zenlytool.com">
123+
<link rel="preload" href="assets/fonts/fonts.css" as="style">
124+
<link rel="preload" href="assets/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1ZL7.woff2" as="font" type="font/woff2"
125+
crossorigin>
124126

125-
<!-- Local Fonts: Inter + JetBrains Mono -->
127+
<!-- Critical Fonts -->
126128
<link rel="stylesheet" href="assets/fonts/fonts.css">
127129

130+
<!-- Heavy Libraries (Deferred for performance) -->
131+
<script src="assets/lib/pdf.min.js" defer></script>
132+
<script src="assets/lib/jspdf.umd.min.js" defer></script>
133+
128134
<style>
129135
:root {
130136
/* Color Palette: Minimalist Black, White, Grey */
@@ -1124,6 +1130,15 @@ <h4>Does it reduce slide quality?</h4>
11241130
if (rect.top < window.innerHeight) el.classList.add('active');
11251131
});
11261132
});
1133+
1134+
// --- Service Worker Registration ---
1135+
if ('serviceWorker' in navigator) {
1136+
window.addEventListener('load', () => {
1137+
navigator.serviceWorker.register('./sw.js')
1138+
.then(reg => console.log('SW Registered', reg))
1139+
.catch(err => console.log('SW Error', err));
1140+
});
1141+
}
11271142
</script>
11281143

11291144
</body>

sw.js

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
const CACHE_NAME = 'slideclean-v1';
2+
const ASSETS_TO_CACHE = [
3+
'/',
4+
'/index.html',
5+
'/manifest.json',
6+
'/assets/favicon.png',
7+
'/assets/og-image.png',
8+
'/assets/fonts/fonts.css',
9+
'/assets/lib/pdf.min.js',
10+
'/assets/lib/jspdf.umd.min.js'
11+
];
12+
13+
// Install Event
14+
self.addEventListener('install', (event) => {
15+
event.waitUntil(
16+
caches.open(CACHE_NAME).then((cache) => {
17+
return cache.addAll(ASSETS_TO_CACHE);
18+
})
19+
);
20+
self.skipWaiting();
21+
});
22+
23+
// Activate Event
24+
self.addEventListener('activate', (event) => {
25+
event.waitUntil(
26+
caches.keys().then((cacheNames) => {
27+
return Promise.all(
28+
cacheNames.map((cache) => {
29+
if (cache !== CACHE_NAME) {
30+
return caches.delete(cache);
31+
}
32+
})
33+
);
34+
})
35+
);
36+
self.clients.claim();
37+
});
38+
39+
// Fetch Event (Stale-While-Revalidate)
40+
self.addEventListener('fetch', (event) => {
41+
event.respondWith(
42+
caches.match(event.request).then((cachedResponse) => {
43+
const fetchPromise = fetch(event.request).then((networkResponse) => {
44+
caches.open(CACHE_NAME).then((cache) => {
45+
cache.put(event.request, networkResponse.clone());
46+
});
47+
return networkResponse;
48+
});
49+
return cachedResponse || fetchPromise;
50+
})
51+
);
52+
});

0 commit comments

Comments
 (0)