Files
EmailBill/Web/public/service-worker.js
孙诚 a9dfcdaa5c
All checks were successful
Docker Build & Deploy / Build Docker Image (push) Successful in 14s
Docker Build & Deploy / Deploy to Production (push) Successful in 7s
PWA支持
2025-12-25 14:15:43 +08:00

142 lines
3.5 KiB
JavaScript

const CACHE_NAME = 'emailbill-v1';
const urlsToCache = [
'/',
'/index.html',
'/favicon.ico',
'/manifest.json'
];
// 安装 Service Worker
self.addEventListener('install', (event) => {
console.log('[Service Worker] 安装中...');
event.waitUntil(
caches.open(CACHE_NAME)
.then((cache) => {
console.log('[Service Worker] 缓存文件');
return cache.addAll(urlsToCache);
})
.then(() => self.skipWaiting())
);
});
// 激活 Service Worker
self.addEventListener('activate', (event) => {
console.log('[Service Worker] 激活中...');
event.waitUntil(
caches.keys().then((cacheNames) => {
return Promise.all(
cacheNames.map((cacheName) => {
if (cacheName !== CACHE_NAME) {
console.log('[Service Worker] 删除旧缓存:', cacheName);
return caches.delete(cacheName);
}
})
);
}).then(() => self.clients.claim())
);
});
// 拦截请求
self.addEventListener('fetch', (event) => {
const { request } = event;
const url = new URL(request.url);
// 跳过跨域请求
if (url.origin !== location.origin) {
return;
}
// API请求使用网络优先策略
if (url.pathname.startsWith('/api/')) {
event.respondWith(
fetch(request)
.then((response) => {
// 克隆响应以便缓存
const responseClone = response.clone();
caches.open(CACHE_NAME).then((cache) => {
cache.put(request, responseClone);
});
return response;
})
.catch(() => {
// 网络失败时尝试从缓存获取
return caches.match(request);
})
);
return;
}
// 静态资源使用缓存优先策略
event.respondWith(
caches.match(request)
.then((response) => {
if (response) {
return response;
}
return fetch(request).then((response) => {
// 检查是否是有效响应
if (!response || response.status !== 200 || response.type !== 'basic') {
return response;
}
const responseClone = response.clone();
caches.open(CACHE_NAME).then((cache) => {
cache.put(request, responseClone);
});
return response;
});
})
.catch(() => {
// 返回离线页面或默认内容
if (request.destination === 'document') {
return caches.match('/index.html');
}
})
);
});
// 后台同步
self.addEventListener('sync', (event) => {
console.log('[Service Worker] 后台同步:', event.tag);
if (event.tag === 'sync-data') {
event.waitUntil(syncData());
}
});
// 推送通知
self.addEventListener('push', (event) => {
console.log('[Service Worker] 收到推送消息');
const options = {
body: event.data ? event.data.text() : '您有新的账单消息',
icon: '/icons/icon-192x192.png',
badge: '/icons/icon-72x72.png',
vibrate: [200, 100, 200],
tag: 'emailbill-notification',
requireInteraction: false
};
event.waitUntil(
self.registration.showNotification('账单管理', options)
);
});
// 通知点击
self.addEventListener('notificationclick', (event) => {
console.log('[Service Worker] 通知被点击');
event.notification.close();
event.waitUntil(
clients.openWindow('/')
);
});
// 数据同步函数
async function syncData() {
try {
// 这里添加需要同步的逻辑
console.log('[Service Worker] 执行数据同步');
} catch (error) {
console.error('[Service Worker] 同步失败:', error);
}
}