В наши дни, готовясь к сертификационному экзамену Google Mobile Specialist Certification, нужно научиться разрабатывать PWA (прогрессивные веб-приложения).
Разработка PWA включает в себя:
1. Адаптивный веб-дизайн, также известный как RWD (медиа-запросы, отзывчивость изображений, точки останова, сетка, Flexbox)
2. Лучшие практики для создания приложения (доступность, оптимизация)
3. Service Workers (сетевой прокси между клиентом и сервером)
Сначала я расскажу о сервисных работниках.
Сервис-воркеры могут перехватывать пользовательские запросы, которые отправляются на сервер для ответа, и могут изменять запрос по нашей команде. Возьмем простой пример: когда сервер отключен и не отвечает, я хочу отображать настраиваемое автономное сообщение вместо игры T-Rex.


SW - это процедура, основанная на событиях, для работы в браузере клиента.
- Зарегистрируйтесь (с помощью navigator.serviceWorker)
- Установить (при появлении нового ПО появляется возможность добавить файлы в кеш)
- Активировать (при появлении нового ПО появляется возможность удалить старые файлы кеша)
- Fetch (каждая запускаемая страница загружается, здесь есть шанс перехватить сетевые запросы)
Лучшая методика при работе с ПО - Cache First. Средство сначала проверяет файлы в кеше, если они недоступны, то получить из сети.
self.addEventListener('fetch', fetchEvent => {
const request = fetchEvent.request;
fetchEvent.respondWith(
// First check from cache
caches.match(request)
.then( responseFromCache => {
if (responseFromCache) {
return responseFromCache
}
})
// Otherwise get from network
return fetch(request);
) // end respondWith
});
Так же, как мы можем делать выборку из сети, если она не в сети, а затем показывать индивидуальную офлайн-страницу.
self.addEventListener('fetch', fetchEvent => {
const request = fetchEvent.request;
fetchEvent.respondWith(
return fetch(request)
// Get offline page from cache
.catch(error => {
return caches.match('/offline.html');
// Page must be saved in cache while install event
});
) // end respondWith
});
Даже мы можем кэшировать изображения в отдельном кеше для лучшего управления кешем в вашем ПО.
if (request.headers.get('Accept').includes('image')) {
// First clone the image request
const copy = responseFromFetch.clone();
fetchEvent.waituntil(
caches.open(imageCacheName)
.then(imageCache => {
// Save in Cache
return imageCache.put(request, copy)
})
);
}
Это похоже на использование блоков Lego, где когда-либо нужно использовать этот блок для удовлетворения ваших требований. Так что просто подумайте о любой блочной структуре и реализуйте ее таким образом.
Надеюсь, это даст вам общее представление о сервис-воркере 👳