Precache — это механизм Workbox, который позволяет заранее кэшировать критически важные ресурсы приложения во время установки service worker. Основная цель — обеспечить мгновенную доступность этих ресурсов при последующих запросах, даже при отсутствии соединения с сетью.
При каждом новом деплое приложение может получать обновления, поэтому ключевым аспектом становится обновление precache. Workbox использует revisioning для управления версиями файлов: каждый ресурс получает уникальный хэш (revision), формируемый на основе содержимого файла. Если содержимое изменилось, хэш меняется, что сигнализирует service worker о необходимости обновить кэш.
Precache manifest — это массив объектов, каждый из которых описывает ресурс для кэширования:
[
{ url: '/index.html', revision: 'a1b2c3d4' },
{ url: '/styles/main.css', revision: 'f5e6g7h8' },
{ url: '/scripts/app.js', revision: 'i9j0k1l2' }
]
Поля объекта:
url — путь к ресурсу относительно корня
приложения.revision — уникальный идентификатор версии файла. Если
он отсутствует, Workbox использует стратегию
cache-first, что потенциально может привести к
устаревшим ресурсам.Workbox позволяет автоматически генерировать precache manifest при
сборке проекта с помощью workbox-build или
workbox-webpack-plugin. При каждом новом билде:
Проходит сканирование указанных директорий.
Вычисляются хэши файлов.
Формируется новый manifest.
При установке нового service worker происходит сравнение старого и нового manifest.
revision обновляются.Пример конфигурации в workbox-webpack-plugin:
const { InjectManifest } = require('workbox-webpack-plugin');
module.exports = {
plugins: [
new InjectManifest({
swSrc: './src/sw.js',
swDest: 'service-worker.js',
include: [/\.html$/, /\.js$/, /\.css$/],
}),
],
};
Workbox обеспечивает плавное обновление кэша через жизненный цикл service worker:
Ключевой момент — при новом деплое изменённые ресурсы получают новый
revision, и при следующей установке service worker они
автоматически скачиваются и заменяют старые версии.
workbox.precaching.getCacheKeyForURL(url) и
workbox.precaching.precacheAndRoute(manifest) для отладки
состояния кэша.import { precacheAndRoute } from 'workbox-precaching';
precacheAndRoute(self.__WB_MANIFEST);
// Опционально, добавление runtime caching для API
import { registerRoute } from 'workbox-routing';
import { NetworkFirst } from 'workbox-strategies';
registerRoute(
({ url }) => url.pathname.startsWith('/api/'),
new NetworkFirst()
);
Этот код обеспечивает:
revision.Workbox делает процесс управления precache прозрачным и автоматизированным, обеспечивая безопасное и эффективное обновление фронтенд-ресурсов при каждом новом деплое.