soiz1 commited on
Commit
1d7fc16
·
verified ·
1 Parent(s): defa5ce

Update sw.js

Browse files
Files changed (1) hide show
  1. sw.js +12 -13
sw.js CHANGED
@@ -9,7 +9,7 @@ let cachedFiles = [
9
 
10
  // install: 必要ファイルをプリキャッシュ
11
  self.addEventListener('install', (event) => {
12
- self.skipWaiting();
13
  event.waitUntil(
14
  caches.open(CACHE_NAME).then(async cache => {
15
  console.log('キャッシュを追加中:', cachedFiles);
@@ -22,7 +22,7 @@ self.addEventListener('install', (event) => {
22
  );
23
  });
24
 
25
- // activate: 古いキャッシュを削除
26
  self.addEventListener('activate', (event) => {
27
  event.waitUntil(
28
  caches.keys().then(keys => Promise.all(
@@ -35,25 +35,22 @@ self.addEventListener('activate', (event) => {
35
  );
36
  });
37
 
38
- // fetch: HTML network-first、それ以外は cache-first(メディアはキャッシュ優先)
39
  self.addEventListener('fetch', (event) => {
40
  const req = event.request;
41
  const accept = req.headers.get('accept') || '';
42
 
43
- // ナビゲーション/HTML リクエストは network-first
44
  if (accept.includes('text/html')) {
45
  event.respondWith(
46
  (async () => {
47
  try {
48
  const networkResponse = await fetch(req);
49
- // 成功したらキャッシュを更新して返す(オプション)
50
  const copy = networkResponse.clone();
51
  const cache = await caches.open(CACHE_NAME);
52
- // キャッシュのキーは pathname/query をそのまま使うと安全です
53
- await cache.put(req, copy).catch(()=>{/* ignore */});
54
  return networkResponse;
55
  } catch (err) {
56
- // ネットワーク失敗時はキャッシュを返す。なければ /index.html をフォールバック
57
  const cacheResp = await caches.match(req);
58
  return cacheResp || caches.match('/index.html');
59
  }
@@ -62,24 +59,21 @@ self.addEventListener('fetch', (event) => {
62
  return;
63
  }
64
 
65
- // それ以外(メディアや静的ファイル)は cache-first
66
  event.respondWith(
67
  caches.match(req).then(async cacheResp => {
68
  if (cacheResp) return cacheResp;
69
  try {
70
  const networkResp = await fetch(req);
71
- // 必要なら動的にキャッシュする(例えば静的アセットのみ)
72
- // 以下はメディアを動的にキャッシュしない例(容量対策)
73
  return networkResp;
74
  } catch (err) {
75
- // オフラインでキャッシュも無い場合は失敗レスポンスを返す
76
  return new Response('Network error and no cache', { status: 504 });
77
  }
78
  })
79
  );
80
  });
81
 
82
- // message: 動的にキャッシュリストを入れ替える(必要に応じて)
83
  self.addEventListener('message', (event) => {
84
  if (event.data?.type === 'CACHE_FILES') {
85
  const files = event.data.files || [];
@@ -110,4 +104,9 @@ self.addEventListener('message', (event) => {
110
  })()
111
  );
112
  }
 
 
 
 
 
113
  });
 
9
 
10
  // install: 必要ファイルをプリキャッシュ
11
  self.addEventListener('install', (event) => {
12
+ self.skipWaiting(); // 新しいSWを即アクティベート
13
  event.waitUntil(
14
  caches.open(CACHE_NAME).then(async cache => {
15
  console.log('キャッシュを追加中:', cachedFiles);
 
22
  );
23
  });
24
 
25
+ // activate: 古いキャッシュを削除 & clients.claim()で即制御
26
  self.addEventListener('activate', (event) => {
27
  event.waitUntil(
28
  caches.keys().then(keys => Promise.all(
 
35
  );
36
  });
37
 
38
+ // fetch: HTMLはnetwork-first、それ以外はcache-first
39
  self.addEventListener('fetch', (event) => {
40
  const req = event.request;
41
  const accept = req.headers.get('accept') || '';
42
 
43
+ // HTMLナビゲーションは network-first
44
  if (accept.includes('text/html')) {
45
  event.respondWith(
46
  (async () => {
47
  try {
48
  const networkResponse = await fetch(req);
 
49
  const copy = networkResponse.clone();
50
  const cache = await caches.open(CACHE_NAME);
51
+ await cache.put(req, copy).catch(() => { /* ignore */ });
 
52
  return networkResponse;
53
  } catch (err) {
 
54
  const cacheResp = await caches.match(req);
55
  return cacheResp || caches.match('/index.html');
56
  }
 
59
  return;
60
  }
61
 
62
+ // その他(メディア・静的ファイル)はcache-first
63
  event.respondWith(
64
  caches.match(req).then(async cacheResp => {
65
  if (cacheResp) return cacheResp;
66
  try {
67
  const networkResp = await fetch(req);
 
 
68
  return networkResp;
69
  } catch (err) {
 
70
  return new Response('Network error and no cache', { status: 504 });
71
  }
72
  })
73
  );
74
  });
75
 
76
+ // message: 動的にキャッシュリストを入れ替える
77
  self.addEventListener('message', (event) => {
78
  if (event.data?.type === 'CACHE_FILES') {
79
  const files = event.data.files || [];
 
104
  })()
105
  );
106
  }
107
+
108
+ // SKIP_WAITINGメッセージで即反映
109
+ if (event.data?.type === 'SKIP_WAITING') {
110
+ self.skipWaiting();
111
+ }
112
  });