// 古诗词智能解析器 - Service Worker // 支持PWA功能,提供离线访问能力 const CACHE_NAME = 'poetry-ai-v1.0.0'; const urlsToCache = [ '/', '/index.html', '/static/css/style.css', '/static/js/main.js', 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css', 'https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@400;700&family=Ma+Shan+Zheng&display=swap' ]; // 安装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(() => { console.log('Service Worker: 安装完成'); return 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(() => { console.log('Service Worker: 激活完成'); return self.clients.claim(); }) ); }); // 拦截网络请求 self.addEventListener('fetch', event => { // 只处理GET请求 if (event.request.method !== 'GET') return; // 对于API请求,使用网络优先策略 if (event.request.url.includes('/api/')) { event.respondWith( fetch(event.request) .then(response => { // 克隆响应以进行缓存 const responseToCache = response.clone(); caches.open(CACHE_NAME) .then(cache => { cache.put(event.request, responseToCache); }); return response; }) .catch(() => { // 网络失败时尝试从缓存获取 return caches.match(event.request); }) ); return; } // 对于静态资源,使用缓存优先策略 event.respondWith( caches.match(event.request) .then(cachedResponse => { if (cachedResponse) { console.log('Service Worker: 从缓存返回:', event.request.url); return cachedResponse; } // 缓存中没有,从网络获取 return fetch(event.request) .then(response => { // 检查响应是否有效 if (!response || response.status !== 200 || response.type !== 'basic') { return response; } // 克隆响应以进行缓存 const responseToCache = response.clone(); caches.open(CACHE_NAME) .then(cache => { cache.put(event.request, responseToCache); }); return response; }) .catch(error => { console.log('Service Worker: 获取失败:', error); // 对于HTML页面,返回离线页面 if (event.request.headers.get('accept').includes('text/html')) { return caches.match('/index.html'); } // 对于其他资源,可以返回一个占位符 return new Response('网络连接失败,请检查网络设置。', { status: 408, headers: { 'Content-Type': 'text/plain' } }); }); }) ); }); // 处理推送通知 self.addEventListener('push', event => { console.log('Service Worker: 收到推送通知'); const options = { body: event.data ? event.data.text() : '古诗词智能解析器有新内容更新', icon: '/static/images/icon-192.png', badge: '/static/images/badge-72.png', vibrate: [100, 50, 100], data: { dateOfArrival: Date.now(), primaryKey: '1' }, actions: [ { action: 'explore', title: '探索诗词', icon: '/static/images/explore-icon.png' }, { action: 'close', title: '关闭', icon: '/static/images/close-icon.png' } ] }; event.waitUntil( self.registration.showNotification('古诗词智能解析器', options) ); }); // 处理通知点击 self.addEventListener('notificationclick', event => { console.log('Service Worker: 通知被点击'); event.notification.close(); if (event.action === 'explore') { // 用户点击了"探索诗词"按钮 event.waitUntil( clients.openWindow('/') ); } else { // 用户点击了通知主体 event.waitUntil( clients.matchAll({ type: 'window', includeUncontrolled: true }).then(clientList => { // 如果已经有打开的窗口,聚焦它 for (const client of clientList) { if (client.url === '/' && 'focus' in client) { return client.focus(); } } // 否则打开新窗口 if (clients.openWindow) { return clients.openWindow('/'); } }) ); } }); // 处理后台同步 self.addEventListener('sync', event => { console.log('Service Worker: 后台同步:', event.tag); if (event.tag === 'sync-favorites') { event.waitUntil(syncFavorites()); } }); // 同步收藏数据 function syncFavorites() { console.log('Service Worker: 同步收藏数据'); // 这里应该实现实际的同步逻辑 // 暂时只是记录日志 return Promise.resolve(); } // 处理消息 self.addEventListener('message', event => { console.log('Service Worker: 收到消息:', event.data); if (event.data && event.data.type === 'SKIP_WAITING') { self.skipWaiting(); } });