feat(pwa): Network-First 서비스 워커 — 홈화면 앱 자동 갱신

- sw.js: Network-First 캐시 전략 (GET + same-origin + res.ok만 캐시)
- tkfb-core.js: SW 등록 + 업데이트 감지 시 자동 새로고침
  (최초 설치 시 토스트 방지: controller 체크)
- manifest.json: start_url → dashboard-new.html
- nginx: sw.js, manifest.json no-cache 헤더
- 배포 시 sw.js의 APP_VERSION만 변경하면 전 사용자 자동 갱신

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Hyungi Ahn
2026-04-01 15:36:36 +09:00
parent 46a1f8310d
commit 1cfd4da8ba
41 changed files with 88 additions and 58 deletions

View File

@@ -1,9 +1,18 @@
/* ===== 서비스 워커 해제 (push-sw.js 제외) ===== */
/* ===== 서비스 워커 등록 (Network-First 캐시) ===== */
if ('serviceWorker' in navigator) {
navigator.serviceWorker.getRegistrations().then(function(regs) { regs.forEach(function(r) {
if (!r.active || !r.active.scriptURL.includes('push-sw.js')) { r.unregister(); }
}); });
if (typeof caches !== 'undefined') { caches.keys().then(function(ns) { ns.forEach(function(n) { caches.delete(n); }); }); }
navigator.serviceWorker.register('/sw.js').then(function(reg) {
// 기존 SW가 있을 때만 업데이트 감지 (최초 설치 시 토스트 방지)
if (!navigator.serviceWorker.controller) return;
reg.addEventListener('updatefound', function() {
var newSW = reg.installing;
newSW.addEventListener('statechange', function() {
if (newSW.state === 'activated') {
showToast('새 버전이 적용되었습니다.', 'info');
setTimeout(function() { location.reload(); }, 1500);
}
});
});
});
}
/* ===== Config ===== */