Мобилизация.Гифки – сервис для поиска гифок в перерывах между занятиями.
Сервис написан с использованием bem-components.
Работа избранного в оффлайне реализована с помощью технологии Service Worker.
Для поиска изображений используется API сервиса Giphy.
- Проблема «Более надежное кэширование на этапе
fetch
».
Решить данную проблему можно двумя способами: либо добавить файлgifs.html
в кэш на этапе установки Service Worker'a (install
), либо добавить его в функциюneedStoreForOffline()
.
Исходя из требования дополнительного задания я решил использовать первый споособ. Ведь при активации Service Worker'a (activate
) вызывается методclients.claim()
, и в совокупности такое решение данной проблемы позволяет переключиться в офлайн-режим после первого запроса. - Проблема «Невозможно обновить статику из директорий
vendor
иassets
».
Решение данной проблемы заключается в изменении версии в константной переменнойCACHE_VERSION
на иное, тем самым при активации "нового" Service Worker'a (activate
) будет вызвана функцияdeleteObsoleteCaches()
. - Проблема «Разложить файлы красиво».
Для решения данной проблемы достаточно перенести файлservice-worker.js
в корневую директорию проекта (в данном случаеentrance-task-3
), а также изменить путь кservice-worker.js
в файлеblocks.js
. Требуется это для того, чтобы Service Worker мог обрабатывать все запросы данного сайта. Связано это с тем, что область видимости Service Worker (scope
) ограничивается директорией (и поддиректориями), в которой он находится. - При добавлении гифки в избранное при отключенном интернет-соединении (например, оно оборвалось), она добавляется в хранилище
KvKeeper
, но не добавляется в кэш.
Для решения данной проблемы был добавлен массивbrokenFarovites
, в который записываются все "битые элементы", и при следующем запросе с интернет-соединением добавляет эти элементы в кэш. - При удаления гифки из избранного, она не удаляется из кэша.
Для решения данной проблемы был добавлен обработчик событияfavorite:remove
. - Нужно ли при скачивании сохранять ресурс для оффлайна?
function needStoreForOffline(cacheKey) {
return cacheKey.includes('vendor/') ||
cacheKey.includes('assets/') ||
cacheKey.endsWith('jquery.min.js');
}
- Вопрос №1: зачем нужен этот вызов?
skipWaiting()
Этот вызов необходим при обновлении Service Worker'a. После регистрации обновленный Service Worker будет находиться в т.н. режиме ожидания, когда он не обрабатывает запросы. Этим занимается старая версия Service Worker. Вызов этого метода позволяет обновленному Service Worker начать обрабатывать запросы. - Вопрос №2: зачем нужен этот вызов?
clients.claim()
После регистрации Service Worker нужно еще активировать. По умолчанию это происходит после перезагрузки страницы. Вызов этого метода немедленно активирует Service Worker. - Вопрос №3: для всех ли случаев подойдет такое построение ключа?
url.origin + url.pathname
Нет, если в запросе будет присутствовать параметрurl.search
. - Вопрос №4: зачем нужна эта цепочка вызовов?
return Promise.all(
names.filter(name => name !== CACHE_VERSION)
.map(name => {
console.log('[ServiceWorker] Deleting obsolete cache:', name);
return caches.delete(name);
})
);
Чтобы удалить старую версию кэша, не повреждая данные.
- Вопрос №5: для чего нужно клонирование?
С полученнымresponse
нам надо сделать две вещи: положить в кэш и ответить на событие (т.е. вернуть его). Так как объектresponse
может быть использован только один раз, клонирование позволяет нам создать копию для нужд кэша.