// sw.js - TK공장관리 Service Worker (network-first) // 주의: 이 파일을 수정할 때는 반드시 CACHE_VERSION을 올려주세요. // 잘못된 수정은 사용자 브라우저에 최대 24시간 캐시됩니다. // 자세한 내용: /docs/PWA-GUIDE.md const CACHE_VERSION = 'tkfb-v3'; const CACHE_NAME = `tkfb-cache-${CACHE_VERSION}`; // 캐시할 정적 리소스 (앱 셸) const APP_SHELL = [ '/pages/dashboard.html', '/css/design-system.css', '/css/mobile.css', '/img/icon-192x192.png' ]; // 설치: 앱 셸 프리캐시 self.addEventListener('install', (event) => { event.waitUntil( caches.open(CACHE_NAME) .then((cache) => cache.addAll(APP_SHELL)) .then(() => self.skipWaiting()) ); }); // 활성화: 이전 버전 캐시 삭제 self.addEventListener('activate', (event) => { event.waitUntil( caches.keys() .then((keys) => Promise.all( keys .filter((key) => key.startsWith('tkfb-cache-') && key !== CACHE_NAME) .map((key) => caches.delete(key)) )) .then(() => self.clients.claim()) ); }); // 요청 가로채기: network-first 전략 self.addEventListener('fetch', (event) => { const request = event.request; // API 요청은 캐시하지 않음 (항상 네트워크) if (request.url.includes('/api/')) { return; } // 로그인 관련 경로는 캐시하지 않음 if (request.url.includes('/login')) { return; } // GET 요청만 캐시 if (request.method !== 'GET') { return; } event.respondWith( fetch(request) .then((response) => { // 정상 응답이면 캐시에 저장 if (response.ok) { const clone = response.clone(); caches.open(CACHE_NAME).then((cache) => cache.put(request, clone)); } return response; }) .catch(() => { // 네트워크 실패 시 캐시에서 응답 return caches.match(request); }) ); });