Skip to content

Commit

Permalink
https://docs.microsoft.com/en-us/aspnet/core/blazor/progressive-web-app
Browse files Browse the repository at this point in the history
PWA without offline support
  • Loading branch information
GioviQ committed Apr 10, 2020
1 parent a1fe6a0 commit 3be6020
Show file tree
Hide file tree
Showing 5 changed files with 72 additions and 1 deletion.
Binary file added src/BlazorBoilerplate.Server/wwwroot/icon-512.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 5 additions & 1 deletion src/BlazorBoilerplate.Server/wwwroot/index_csb.html
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@
<link href="_content/BlazorBoilerplate.CommonUI/css/bootstrap/bootstrap.min.css" rel="stylesheet" />
<link href="_content/MatBlazor/dist/matBlazor.css" rel="stylesheet" />
<link href="_content/BlazorBoilerplate.CommonUI/css/site.css" rel="stylesheet" />

<link href="manifest.json" rel="manifest" />

<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-55161075-2"></script>
<script>
Expand Down Expand Up @@ -58,5 +59,8 @@
<script src="_content/BlazorBoilerplate.CommonUI/javascript/chatClient.js"></script>
<script src="_content/BlazorBoilerplate.CommonUI/javascript/jsInterops.js"></script>
<script src="_content/Microsoft.AspNetCore.ProtectedBrowserStorage/protectedBrowserStorage.js"></script>

<!-- https://docs.microsoft.com/en-us/aspnet/core/blazor/progressive-web-app -->
<script>navigator.serviceWorker.register('service-worker.js');</script>
</body>
</html>
15 changes: 15 additions & 0 deletions src/BlazorBoilerplate.Server/wwwroot/manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"name": "Blazor Boilerplate & Starter Kit (CSB)",
"short_name": "Blazor Boilerplate",
"start_url": "/",
"display": "standalone",
"background_color": "#ffffff",
"theme_color": "#5D2E8F",
"icons": [
{
"src": "icon-512.png",
"type": "image/png",
"sizes": "512x512"
}
]
}
4 changes: 4 additions & 0 deletions src/BlazorBoilerplate.Server/wwwroot/service-worker.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
// In development, always fetch from the network and do not enable offline support.
// This is because caching would make development more difficult (changes would not
// be reflected on the first load after each change).
self.addEventListener('fetch', () => { });
48 changes: 48 additions & 0 deletions src/BlazorBoilerplate.Server/wwwroot/service-worker.published.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
// Caution! Be sure you understand the caveats before publishing an application with
// offline support. See https://aka.ms/blazor-offline-considerations

self.importScripts('./service-worker-assets.js');
self.addEventListener('install', event => event.waitUntil(onInstall(event)));
self.addEventListener('activate', event => event.waitUntil(onActivate(event)));
self.addEventListener('fetch', event => event.respondWith(onFetch(event)));

const cacheNamePrefix = 'offline-cache-';
const cacheName = `${cacheNamePrefix}${self.assetsManifest.version}`;
const offlineAssetsInclude = [ /\.dll$/, /\.pdb$/, /\.wasm/, /\.html/, /\.js$/, /\.json$/, /\.css$/, /\.woff$/, /\.png$/, /\.jpe?g$/, /\.gif$/, /\.ico$/ ];
const offlineAssetsExclude = [ /^service-worker\.js$/ ];

async function onInstall(event) {
console.info('Service worker: Install');

// Fetch and cache all matching items from the assets manifest
const assetsRequests = self.assetsManifest.assets
.filter(asset => offlineAssetsInclude.some(pattern => pattern.test(asset.url)))
.filter(asset => !offlineAssetsExclude.some(pattern => pattern.test(asset.url)))
.map(asset => new Request(asset.url, { integrity: asset.hash }));
await caches.open(cacheName).then(cache => cache.addAll(assetsRequests));
}

async function onActivate(event) {
console.info('Service worker: Activate');

// Delete unused caches
const cacheKeys = await caches.keys();
await Promise.all(cacheKeys
.filter(key => key.startsWith(cacheNamePrefix) && key !== cacheName)
.map(key => caches.delete(key)));
}

async function onFetch(event) {
let cachedResponse = null;
if (event.request.method === 'GET') {
// For all navigation requests, try to serve index.html from cache
// If you need some URLs to be server-rendered, edit the following check to exclude those URLs
const shouldServeIndexHtml = event.request.mode === 'navigate';

const request = shouldServeIndexHtml ? 'index.html' : event.request;
const cache = await caches.open(cacheName);
cachedResponse = await cache.match(request);
}

return cachedResponse || fetch(event.request);
}

0 comments on commit 3be6020

Please sign in to comment.