diff --git a/_11ty/plugins.js b/_11ty/plugins.js
index e1a3caf..17c99a9 100644
--- a/_11ty/plugins.js
+++ b/_11ty/plugins.js
@@ -1,4 +1,3 @@
-/* eslint-disable indent */
const { IS_PRODUCTION } = require('./constants');
const siteConfig = require('../content/_data/siteConfig');
const pluginRss = require('@11ty/eleventy-plugin-rss');
@@ -18,6 +17,32 @@ const productionPlugins = IS_PRODUCTION
]
: [];
+const pwaPluginConfig = siteConfig.enablePWA
+ ? [
+ {
+ body: pluginPWA,
+ options: {
+ cacheId: siteConfig.site.title,
+ runtimeCaching: [
+ {
+ urlPattern: /\/$/,
+ handler: 'NetworkFirst',
+ },
+ {
+ urlPattern: /\.html$/,
+ handler: 'NetworkFirst',
+ },
+ {
+ urlPattern:
+ /^.*\.(jpg|png|mp4|gif|webp|ico|svg|woff2|woff|eot|ttf|otf|ttc|json)$/,
+ handler: 'StaleWhileRevalidate',
+ },
+ ],
+ },
+ },
+ ]
+ : [];
+
const plugins = [
{
body: EleventyHtmlBasePlugin,
@@ -31,9 +56,6 @@ const plugins = [
{
body: eleventyNavigationPlugin,
},
- {
- body: pluginPWA,
- },
{
body: syntaxHighlight,
},
@@ -52,8 +74,8 @@ const plugins = [
background_color: siteConfig.manifestJson.backgroundColor,
orientation: 'any',
},
- }
+ },
},
];
-module.exports = [...plugins, ...productionPlugins];
+module.exports = [...plugins, ...pwaPluginConfig, ...productionPlugins];
diff --git a/content/_data/siteConfig.js b/content/_data/siteConfig.js
index 1b621e3..ff96431 100644
--- a/content/_data/siteConfig.js
+++ b/content/_data/siteConfig.js
@@ -145,8 +145,9 @@ module.exports = {
postsPerPage: 10,
},
// ---------------------------------------------------------------------------
- // Settings for PWA manifest file
+ // Settings for PWA
// ---------------------------------------------------------------------------
+ enablePWA: false, // If enabled, service worker for PWA will be registered
manifestJson: {
// Language of PWA application
language: 'en-US',
diff --git a/content/_includes/partials/head/service-worker.njk b/content/_includes/partials/head/service-worker.njk
index 728dc83..a1d67c4 100644
--- a/content/_includes/partials/head/service-worker.njk
+++ b/content/_includes/partials/head/service-worker.njk
@@ -1,3 +1,33 @@
+{% if siteConfig.enablePWA %}
\ No newline at end of file
+ if ('serviceWorker' in navigator) {
+ navigator.serviceWorker.register('/service-worker.js')
+ .then(registration => {
+ registration.addEventListener('updatefound', () => {
+ const newWorker = registration.installing;
+
+ newWorker.addEventListener('statechange', () => {
+ if (newWorker.state === 'installed') {
+ if (navigator.serviceWorker.controller) {
+ window.location.reload();
+ }
+ }
+ });
+ });
+ })
+ .catch(error => {
+ console.error('Service Worker registration failed:', error);
+ });
+ }
+
+{% else %}
+
+{% endif %}
\ No newline at end of file