// Service Worker for PWA const CACHE_NAME = 'qingyuan-erp-v1'; const STATIC_ASSETS = [ '/', '/index.html', '/manifest.json', '/logo.png' ]; // 安装时缓存静态资源 self.addEventListener('install', (event) => { event.waitUntil( caches.open(CACHE_NAME).then((cache) => { return cache.addAll(STATIC_ASSETS); }).catch((err) => { console.log('Cache failed:', err); }) ); self.skipWaiting(); }); // 激活时清理旧缓存 self.addEventListener('activate', (event) => { event.waitUntil( caches.keys().then((cacheNames) => { return Promise.all( cacheNames .filter((name) => name !== CACHE_NAME) .map((name) => caches.delete(name)) ); }) ); self.clients.claim(); }); // 拦截请求,优先使用缓存 self.addEventListener('fetch', (event) => { // 跳过非GET请求和API请求 if (event.request.method !== 'GET' || event.request.url.includes('/api/') || event.request.url.includes('chrome-extension')) { return; } event.respondWith( caches.match(event.request).then((response) => { // 如果缓存中有,返回缓存 if (response) { return response; } // 否则发起网络请求 return fetch(event.request).then((networkResponse) => { // 缓存新请求 if (networkResponse.status === 200) { const responseToCache = networkResponse.clone(); caches.open(CACHE_NAME).then((cache) => { cache.put(event.request, responseToCache); }); } return networkResponse; }).catch(() => { // 网络失败时返回离线页面 if (event.request.mode === 'navigate') { return caches.match('/index.html'); } }); }) ); });