workbox-build предоставляет мощный инструмент для
генерации и управления precache-манифестами в приложениях на JavaScript.
Одним из ключевых режимов является getManifest, который
позволяет получить список ресурсов для precache без непосредственной
генерации сервис-воркера. Это особенно удобно для интеграции с
кастомными сборками и системами, где сервис-воркер создается вручную или
с помощью других инструментов.
getManifestМетод getManifest используется для анализа указанной
директории и создания массива объектов, каждый из которых описывает
ресурс, его путь и хеш-сумму содержимого. Этот массив затем может быть
передан в сервис-воркер для precache.
Пример базового вызова:
const { getManifest } = require('workbox-build');
async function buildManifest() {
const manifest = await getManifest({
globDirectory: 'dist/',
globPatterns: [
'**/*.{js,css,html,png,jpg,json}'
]
});
console.log(manifest);
}
buildManifest();
Ключевые параметры:
globDirectory – корневая директория проекта, где
располагаются статические файлы.globPatterns – массив шаблонов, определяющих, какие
файлы включать в precache.globIgnores – массив шаблонов для исключения файлов
(например, ['**/ignored.js']).dontCacheBustURLsMatching – регулярное выражение для
файлов, хеш которых уже встроен в имя. Позволяет избежать лишней
генерации хеша.maximumFileSizeToCacheInBytes – ограничение на размер
файла для precache, чтобы не включать очень большие ресурсы.Метод возвращает объект с ключами:
count – количество файлов, найденных для precache.size – общий размер файлов в байтах.manifest – массив объектов вида:{
url: 'main.abcdef.js',
revision: '1234567890abcdef'
}
Режим getManifest позволяет гибко интегрировать precache
в уже существующие сервис-воркеры. Пример:
const { getManifest } = require('workbox-build');
const fs = require('fs');
async function injectPrecache() {
const { manifest } = await getManifest({
globDirectory: 'dist/',
globPatterns: ['**/*.js', '**/*.css', '**/*.html']
});
const swTemplate = `
import { precacheAndRoute } from 'workbox-precaching';
precacheAndRoute(${JSON.stringify(manifest)});
self.addEventListener('fetch', (event) => {
// дополнительные стратегии кеширования
});
`;
fs.writeFileSync('dist/sw.js', swTemplate);
}
injectPrecache();
В этом примере:
getManifest.precacheAndRoute.fetch или других событий сервис-воркера.Каждый объект манифеста содержит поле revision, которое
автоматически создается на основе хеша содержимого файла. Это
обеспечивает:
Если необходимо вручную управлять ревизиями, можно модифицировать
массив manifest после вызова getManifest,
перед передачей его в precacheAndRoute.
dontCacheBustURLsMatchingЭтот параметр позволяет исключить из пересчета хеша файлы, уже
содержащие уникальный идентификатор в имени. Например, если сборка
использует хеширование в имени main.abcdef.js, можно
задать:
dontCacheBustURLsMatching: /\.[0-9a-f]{8}\./
Это предотвратит лишние изменения ревизий для уже уникально идентифицированных файлов и ускорит процесс сборки.
Чтобы избежать кеширования слишком больших ресурсов (например, видео
или больших JSON), используется параметр
maximumFileSizeToCacheInBytes:
maximumFileSizeToCacheInBytes: 5 * 1024 * 1024 // 5MB
Файлы, превышающие этот размер, будут проигнорированы при генерации манифеста.
Режим getManifest идеально подходит для: