12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- const CACHE_NAME = 'shenze-cache-v1'; // 更新版本号强制更新
- const DYNAMIC_CACHE = 'shenze-dynamic-v1';
- const STATIC_ASSETS = [
- '/shenze/index.html',
- '/shenze/favicon.ico',
- '/shenze/manifest.json',
- // 避免缓存 version.json
- ];
- self.addEventListener('install', (event) => {
- event.waitUntil(
- caches.open(CACHE_NAME)
- .then(cache => cache.addAll(STATIC_ASSETS))
- .then(() => self.skipWaiting())
- );
- });
- self.addEventListener('activate', (event) => {
- event.waitUntil(
- caches.keys().then(cacheNames => {
- return Promise.all(
- cacheNames.map(cacheName => {
- if (cacheName !== CACHE_NAME && cacheName !== DYNAMIC_CACHE) {
- return caches.delete(cacheName);
- }
- })
- );
- }).then(() => self.clients.claim())
- );
- });
- // fetch 事件:合理区分缓存策略
- self.addEventListener('fetch', (event) => {
- const url = new URL(event.request.url);
- // version.json 永远走网络
- if (url.pathname === '/shenze/version.json') {
- event.respondWith(
- fetch(event.request)
- .then(response => response)
- .catch(() => new Response('{}', { headers: { 'Content-Type': 'application/json' } }))
- );
- return;
- }
- // index.html 及所有 HTML 页面,网络优先
- if (url.pathname === '/shenze/' || url.pathname.endsWith('.html')) {
- event.respondWith(
- fetch(event.request)
- .then(response => {
- // 更新缓存
- const copy = response.clone();
- caches.open(CACHE_NAME).then(cache => cache.put(event.request, copy));
- return response;
- })
- .catch(() => caches.match(event.request))
- );
- return;
- }
- // 其他静态资源(js/css/img/font等),缓存优先
- event.respondWith(
- caches.match(event.request).then(cachedResponse => {
- return cachedResponse || fetch(event.request).then(networkResponse => {
- if (event.request.method === 'GET' && networkResponse && networkResponse.status === 200) {
- const copy = networkResponse.clone();
- caches.open(DYNAMIC_CACHE).then(cache => cache.put(event.request, copy));
- }
- return networkResponse;
- }).catch(() => {
- return undefined;
- });
- })
- );
- });
- self.addEventListener('message', event => {
- if (event.data === 'skip-waiting') {
- self.skipWaiting();
- }
- });
|