Как сделать страницу, которая будет отображаться по умолчанию при входе на сайт без интернета?
Если отключить интернет и зайти на Ютуб через Хром, можно увидеть такую страницу (при условии, что ранее сайт хотя бы один раз загружался в этом браузере):
Попробовал через Mozilla, Opera – нет такого.
Как это работает?
Ответы (1 шт):
Автор решения: Vadizar
→ Ссылка
Для этой цели вам нужно использовать ServiceWorker. Также вам необходимо предоставлять ваш код по протоколу HTTPS – Service Worker требует это по соображениям безопасности. Ниже привожу пример кода, который я ранее использовал для одного из проектов. Скрипт написан ещё на ES5, но даёт примерное понимание реализации оффлайн функционала:
// наименование для нашего хранилища кэша
var CACHE_NAME = 'app_serviceworker_v_1',
// ссылки на кэшируемые файлы и страницы
cacheUrls = [
'/ru',
'/en',
'/css/style.css',
'/js/script.js'
];
self.addEventListener('install', function(event) {
// задержим обработку события
// если произойдёт ошибка, serviceWorker не установится
event.waitUntil(
// находим в глобальном хранилище Cache-объект с нашим именем
// если такого не существует, то он будет создан
caches.open(CACHE_NAME).then(function(cache) {
// загружаем в наш cache необходимые файлы
return cache.addAll(cacheUrls);
})
);
});
// период обновления кэша - минута
var MAX_AGE = 60;
self.addEventListener('fetch', function(event) {
event.respondWith(
// ищем запрошенный ресурс среди закэшированных
caches.match(event.request).then(function(cachedResponse) {
var lastModified, fetchRequest;
// если ресурс есть в кэше
if (cachedResponse) {
// получаем дату последнего обновления
lastModified = new Date(cachedResponse.headers.get('last-modified'));
// и если мы считаем ресурс устаревшим
if (lastModified && (Date.now() - lastModified.getTime()) > MAX_AGE) {
fetchRequest = event.request.clone();
// создаём новый запрос
return fetch(fetchRequest).then(function(response) {
var responseClone = response.clone();
// при неудаче всегда можно выдать ресурс из кэша
if (!response || response.status !== 200) {
return cachedResponse;
} else {
// обновляем кэш
caches.open(CACHE_NAME).then(function(cache) {
cache.put(event.request, responseClone);
});
// возвращаем свежий ресурс
return response;
}
}).catch(function() {
return cachedResponse;
});
}
return cachedResponse;
}
// запрашиваем из сети как обычно
return fetch(event.request);
})
);
});
