Sw-precache — это инструмент для генерации сервис-воркера, который позволяет автоматически кэшировать статические файлы веб-приложения. Основная цель — ускорение загрузки страниц и обеспечение работы приложения в офлайн-режиме. Особенно важно корректное кэширование шрифтов и сторонних ресурсов, поскольку они часто загружаются с внешних CDN и требуют отдельного внимания.
Шрифты являются критически важными ресурсами, влияющими на рендеринг страницы. Некорректная работа с ними может привести к FOUT (Flash of Unstyled Text) или FOIT (Flash of Invisible Text). Sw-precache позволяет заранее указать, какие шрифты должны быть закэшированы, и задать стратегию их обновления.
const swPrecache = require('sw-precache');
swPrecache.write('service-worker.js', {
staticFileGlobs: [
'index.html',
'styles/**/*.css',
'scripts/**/*.js',
'fonts/**/*.woff2',
'fonts/**/*.woff'
],
stripPrefix: 'dist/',
runtimeCaching: [{
urlPattern: /^https:\/\/fonts\.googleapis\.com/,
handler: 'cacheFirst',
options: {
cache: {
maxEntries: 10,
name: 'google-fonts-stylesheets',
maxAgeSeconds: 60 * 60 * 24 * 365 // 1 год
}
}
}, {
urlPattern: /^https:\/\/fonts\.gstatic\.com/,
handler: 'cacheFirst',
options: {
cache: {
maxEntries: 20,
name: 'google-fonts-webfonts',
maxAgeSeconds: 60 * 60 * 24 * 365
}
}
}]
});
Такой подход гарантирует, что шрифты Google Fonts будут загружены один раз и использоваться повторно без лишних сетевых запросов.
Веб-приложения часто используют JavaScript-библиотеки и CSS-фреймворки с внешних CDN. При неправильной конфигурации сервис-воркера могут возникнуть конфликты версий и ошибки загрузки.
runtimeCaching: [{
urlPattern: /^https:\/\/cdnjs\.cloudflare\.com\/ajax\/libs\/jquery\/.*\.js/,
handler: 'cacheFirst',
options: {
cache: {
maxEntries: 5,
name: 'jquery-cdn-cache',
maxAgeSeconds: 60 * 60 * 24 * 30 // 30 дней
}
}
}, {
urlPattern: /^https:\/\/stackpath\.bootstrapcdn\.com\/.*\.css/,
handler: 'cacheFirst',
options: {
cache: {
maxEntries: 3,
name: 'bootstrap-cdn-cache',
maxAgeSeconds: 60 * 60 * 24 * 30
}
}
}]
Важно: всегда указывать maxEntries,
чтобы избежать переполнения кэша и ошибок при загрузке новых версий.
google-fonts-webfonts,
jquery-cdn-cache) для удобства управления и очистки.staticFileGlobs, чтобы они сразу попадали в кэш при
установке сервис-воркера.caches.delete() и caches.keys().fonts.googleapis.com) и шрифтов
(fonts.gstatic.com).@font-face. Поэтому CSS необходимо кэшировать с
cacheFirst, чтобы избежать повторных сетевых запросов.Service Worker.Sw-precache позволяет гибко управлять кэшированием шрифтов и сторонних ресурсов, обеспечивая быстрый рендеринг страницы и стабильную работу приложения даже при ограниченном подключении к сети. Правильная конфигурация кэшей и стратегий обновления критически важна для производительности и корректного отображения контента.