# GOHUGO PWA SETUP
## layouts/partials/custom_head.html
```html
A new version is available.
```
## layouts/partials/custom_body.html
```html
```
## static/main.js
```javascript
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('/sw.js')
.then(req => {
console.log('Registered!', reg);
}).catch(err => {
console.log('Registration failed: ', err);
});
});
}
```
## static/manifest.webmanifest
```json
{
"name": "Pat K",
"short_name": "PK",
"start_url": "/",
"scope": "/",
"background_color": "#000000",
"theme_color": "#2e1e3c",
"display": "standalone",
"id": "5801e2e4fab6956ac349d7c724329b869cbffb19e87e545cd5bf6ffb2cc4a3e7",
"icons": [
{
"src": "icons/192.png",
"type": "image/png",
"sizes": "192x192"
},
{
"src": "icons/512.png",
"type": "image/png",
"sizes": "512x512"
}
]
}
```
## static/icons
```bash
ffmpeg -i example.png -vf "scale=192:192" icon-192.png
ffmpeg -i example.png -vf "scale=512:512" icon-512.png
```
## hugo.toml
```toml
[outputs]
home = ["HTML", "SW"]
[outputFormats.SW]
mediaType = "text/javascript"
baseName = "sw"
isPlainText = true
notAlternative = true
```
## themes/hugo-bearblog/layouts/index.sw.js
```javascript
const CACHE_NAME = "patk-{{ now.Unix }}";
const PRECACHE = [
"/index.html",
"/manifest.webmanifest",
"/main.js",
"/robots.txt",
"/icons/192.png",
"/icons/512.png",
"/404.html",
"/sitemap.xml",
{{- range hugo.Sites }}
{{- range .Pages }}
{{ printf "%q" .RelPermalink }},
{{- end }}
{{- end }}
];
self.addEventListener("install", (event) => {
event.waitUntil(
caches.open(CACHE_NAME).then((cache) => {
return cache.addAll(PRECACHE);
})
);
// self.skipWaiting(); // remove if want to changes to occur without pressing reload button
});
self.addEventListener("activate", (event) => {
event.waitUntil(
caches.keys().then((keys) => {
return Promise.all(
keys
.filter((key) => key !== CACHE_NAME)
.map((key) => caches.delete(key))
);
})
);
self.clients.claim();
});
self.addEventListener("fetch", (event) => {
event.respondWith(
caches.match(event.request).then((cachedResponse) => {
return cachedResponse || fetch(event.request);
// return fetch(event.request) || cachedResponse; // switch if you want to fetch resources first and serve cached if offline; current serve cache then request online fetch if error or not available
})
);
});
self.addEventListener("message", (event) => {
if (event.data?.type === "SKIP_WAITING") {
self.skipWaiting();
}
});
```
## Makefile
- Make file requires tabs not space indentation
```makefile
.PHONY: help cl gen serve pub dev
help:
@echo "Usage: make