Skip to content

Commit f136052

Browse files
authored
[Blazor] Update service worker template to prevent index.html being served when an offline resource is requested. (#47168)
The service worker now checks against the list of the known assets.
1 parent d96f4da commit f136052

File tree

2 files changed

+20
-5
lines changed

2 files changed

+20
-5
lines changed

src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/wwwroot/service-worker.published.js

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ const cacheName = `${cacheNamePrefix}${self.assetsManifest.version}`;
1111
const offlineAssetsInclude = [ /\.dll$/, /\.pdb$/, /\.wasm/, /\.html/, /\.js$/, /\.json$/, /\.css$/, /\.woff$/, /\.png$/, /\.jpe?g$/, /\.gif$/, /\.ico$/, /\.blat$/, /\.dat$/ ];
1212
const offlineAssetsExclude = [ /^service-worker\.js$/ ];
1313

14+
// Replace with your base path if you are hosting on a subfolder. Ensure there is a trailing '/'.
15+
const base = "/";
16+
const baseUrl = new URL(base, self.origin);
17+
const manifestUrlList = self.assetsManifest.assets.map(asset => new URL(asset.url, baseUrl).href);
18+
1419
async function onInstall(event) {
1520
console.info('Service worker: Install');
1621

@@ -41,14 +46,17 @@ async function onActivate(event) {
4146
async function onFetch(event) {
4247
let cachedResponse = null;
4348
if (event.request.method === 'GET') {
44-
// For all navigation requests, try to serve index.html from cache
49+
// For all navigation requests, try to serve index.html from cache,
50+
// unless that request is for an offline resource.
4551
// If you need some URLs to be server-rendered, edit the following check to exclude those URLs
4652
//#if(IndividualLocalAuth && Hosted)
4753
const shouldServeIndexHtml = event.request.mode === 'navigate'
4854
&& !event.request.url.includes('/connect/')
49-
&& !event.request.url.includes('/Identity/');
55+
&& !event.request.url.includes('/Identity/')
56+
&& !manifestUrlList.some(url => url === event.request.url);
5057
//#else
51-
const shouldServeIndexHtml = event.request.mode === 'navigate';
58+
const shouldServeIndexHtml = event.request.mode === 'navigate'
59+
&& !manifestUrlList.some(url => url === event.request.url);
5260
//#endif
5361

5462
const request = shouldServeIndexHtml ? 'index.html' : event.request;

src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/wwwroot/service-worker.published.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ const cacheName = `${cacheNamePrefix}${self.assetsManifest.version}`;
1111
const offlineAssetsInclude = [ /\.dll$/, /\.pdb$/, /\.wasm/, /\.html/, /\.js$/, /\.json$/, /\.css$/, /\.woff$/, /\.png$/, /\.jpe?g$/, /\.gif$/, /\.ico$/, /\.blat$/, /\.dat$/ ];
1212
const offlineAssetsExclude = [ /^service-worker\.js$/ ];
1313

14+
// Replace with your base path if you are hosting on a subfolder. Ensure there is a trailing '/'.
15+
const base = "/";
16+
const baseUrl = new URL(base, self.origin);
17+
const manifestUrlList = self.assetsManifest.assets.map(asset => new URL(asset.url, baseUrl).href);
18+
1419
async function onInstall(event) {
1520
console.info('Service worker: Install');
1621

@@ -35,8 +40,10 @@ async function onActivate(event) {
3540
async function onFetch(event) {
3641
let cachedResponse = null;
3742
if (event.request.method === 'GET') {
38-
// For all navigation requests, try to serve index.html from cache
39-
const shouldServeIndexHtml = event.request.mode === 'navigate';
43+
// For all navigation requests, try to serve index.html from cache,
44+
// unless that request is for an offline resource.
45+
const shouldServeIndexHtml = event.request.mode === 'navigate'
46+
&& !manifestUrlList.some(url => url === event.request.url);
4047

4148
const request = shouldServeIndexHtml ? 'index.html' : event.request;
4249
const cache = await caches.open(cacheName);

0 commit comments

Comments
 (0)