|
| 1 | +// Service Worker |
| 2 | +//------------------------------------------------------------------------------ |
| 3 | + |
| 4 | +'use strict'; |
| 5 | + |
| 6 | +// наименование для нашего хранилища кэша |
| 7 | +var CACHE_NAME = 'app_serviceworker_v_1', |
| 8 | +// ссылки на кэшируемые файлы |
| 9 | + cacheUrls = [ |
| 10 | + '/sample/js/app.js', |
| 11 | + '/sample/index.html' |
| 12 | +]; |
| 13 | + |
| 14 | +self.addEventListener('install', function(event) { |
| 15 | + // задержим обработку события |
| 16 | + // если произойдёт ошибка, serviceWorker не установится |
| 17 | + event.waitUntil( |
| 18 | + // находим в глобальном хранилище Cache-объект с нашим именем |
| 19 | + // если такого не существует, то он будет создан |
| 20 | + caches.open(CACHE_NAME).then(function(cache) { |
| 21 | + // загружаем в наш cache необходимые файлы |
| 22 | + return cache.addAll(cacheUrls); |
| 23 | + }) |
| 24 | + ); |
| 25 | +}); |
| 26 | + |
| 27 | +self.addEventListener('activate', function(event) { |
| 28 | + // активация |
| 29 | + console.log('activate', event); |
| 30 | +}); |
| 31 | + |
| 32 | +// период обновления кэша - одни сутки |
| 33 | +var MAX_AGE = 86400000; |
| 34 | + |
| 35 | +self.addEventListener('fetch', function(event) { |
| 36 | + |
| 37 | + event.respondWith( |
| 38 | + // ищем запрошенный ресурс среди закэшированных |
| 39 | + caches.match(event.request).then(function(cachedResponse) { |
| 40 | + var lastModified, fetchRequest; |
| 41 | + |
| 42 | + // если ресурс есть в кэше |
| 43 | + if (cachedResponse) { |
| 44 | + // получаем дату последнего обновления |
| 45 | + lastModified = new Date(cachedResponse.headers.get('last-modified')); |
| 46 | + // и если мы считаем ресурс устаревшим |
| 47 | + if (lastModified && (Date.now() - lastModified.getTime()) > MAX_AGE) { |
| 48 | + |
| 49 | + fetchRequest = event.request.clone(); |
| 50 | + // создаём новый запрос |
| 51 | + return fetch(fetchRequest).then(function(response) { |
| 52 | + // при неудаче всегда можно выдать ресурс из кэша |
| 53 | + if (!response || response.status !== 200) { |
| 54 | + return cachedResponse; |
| 55 | + } |
| 56 | + // обновляем кэш |
| 57 | + caches.open(CACHE_NAME).then(function(cache) { |
| 58 | + cache.put(event.request, response.clone()); |
| 59 | + }); |
| 60 | + // возвращаем свежий ресурс |
| 61 | + return response; |
| 62 | + }).catch(function() { |
| 63 | + return cachedResponse; |
| 64 | + }); |
| 65 | + } |
| 66 | + return cachedResponse; |
| 67 | + } |
| 68 | + |
| 69 | + // запрашиваем из сети как обычно |
| 70 | + return fetch(event.request); |
| 71 | + }) |
| 72 | + ); |
| 73 | +}); |
| 74 | + |
| 75 | +// // Задаем имя |
| 76 | +// var CACHE = 'mahoweek-cache-and-update'; |
| 77 | + |
| 78 | +// // Устанавливаем |
| 79 | +// self.addEventListener('install', function(event) { |
| 80 | +// // Кэшируем файлы |
| 81 | +// event.waitUntil(precache()); |
| 82 | +// }); |
| 83 | + |
| 84 | +// // Настраиваем ответы на запросы |
| 85 | +// self.addEventListener('fetch', function(event) { |
| 86 | +// // Показываем файлы из кэша |
| 87 | +// event.respondWith(fromCache(event.request)); |
| 88 | + |
| 89 | +// // Обновляем файлы в кэше |
| 90 | +// // event.waitUntil(update(event.request)); |
| 91 | +// }); |
| 92 | + |
| 93 | +// // Выбираем файлы для кэширования |
| 94 | +// function precache() { |
| 95 | +// return caches.open(CACHE).then(function(cache) { |
| 96 | +// return cache.addAll([ |
| 97 | +// '/css/libs.min.css?v=1.13.0', |
| 98 | +// '/css/main.min.css?v=1.13.0', |
| 99 | +// '/js/libs.min.js?v=1.13.0', |
| 100 | +// '/js/app.min.js?v=1.13.0', |
| 101 | +// '/index.html' |
| 102 | +// ]); |
| 103 | +// }); |
| 104 | +// } |
| 105 | + |
| 106 | +// // Выбираем файлы из кэша |
| 107 | +// function fromCache(request) { |
| 108 | +// return caches.open(CACHE).then(function(cache) { |
| 109 | +// return cache.match(request).then(function(matching) { |
| 110 | +// // return matching || Promise.reject('no-match'); |
| 111 | +// if (matching) { |
| 112 | +// return matching; |
| 113 | +// } |
| 114 | + |
| 115 | +// // return fetch(request); |
| 116 | +// }); |
| 117 | +// }); |
| 118 | +// } |
| 119 | + |
| 120 | +// // Обновляем файлы в кэше |
| 121 | +// function update(request) { |
| 122 | +// return caches.open(CACHE).then(function(cache) { |
| 123 | +// return fetch(request).then(function(response) { |
| 124 | +// return cache.put(request, response); |
| 125 | +// }); |
| 126 | +// }); |
| 127 | +// } |
0 commit comments