Workbox — это набор библиотек и инструментов для упрощения создания сервис-воркеров и управления кэшированием в Progressive Web Apps (PWA). Существует несколько способов интеграции Workbox в проект, каждый из которых подходит под разные сценарии разработки.
Наиболее гибкий и часто используемый способ — установка Workbox через npm. Это позволяет интегрировать его в сборку проекта с использованием Webpack, Rollup или других сборщиков.
npm install workbox-cli workbox-core workbox-precaching workbox-routing workbox-strategies
После установки доступны следующие модули:
Пример подключения в сервис-воркере:
import { precacheAndRoute } from 'workbox-precaching';
import { registerRoute } from 'workbox-routing';
import { NetworkFirst, CacheFirst } from 'workbox-strategies';
precacheAndRoute(self.__WB_MANIFEST);
registerRoute(
({request}) => request.destination === 'image',
new CacheFirst({
cacheName: 'images-cache',
})
);
registerRoute(
({request}) => request.destination === 'script' || request.destination === 'style',
new NetworkFirst({
cacheName: 'static-resources',
})
);
Для проектов без сборщика можно использовать CDN. В этом случае
Workbox подключается напрямую через <script> в
сервис-воркере или через importScripts.
Пример подключения через importScripts:
importScripts('https://storage.googleapis.com/workbox-cdn/releases/6.7.0/workbox-sw.js');
if (workbox) {
workbox.precaching.precacheAndRoute([
{ url: '/index.html', revision: '1' },
{ url: '/styles/main.css', revision: '1' },
{ url: '/scripts/app.js', revision: '1' }
]);
workbox.routing.registerRoute(
({request}) => request.destination === 'image',
new workbox.strategies.CacheFirst({
cacheName: 'images-cache',
})
);
}
Преимущества CDN:
Недостатки:
Workbox CLI позволяет автоматически генерировать сервис-воркеры и манифесты кэширования. Это удобно для проектов без сложного сборщика или для прототипов.
Установка CLI:
npm install workbox-cli --global
Генерация сервис-воркера:
workbox wizard
CLI предложит указать:
NetworkFirst или
CacheFirst).precacheManifest).После генерации будет создан файл service-worker.js,
который можно подключить в проекте через регистрацию в основном
скрипте:
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/service-worker.js')
.then(reg => console.log('Service worker registered', reg))
.catch(err => console.error('Service worker registration failed', err));
}
Для проектов с Webpack Workbox предлагает плагин
workbox-webpack-plugin. Он позволяет автоматически включать
кэширование и стратегии без ручного создания сервис-воркера.
Установка:
npm install workbox-webpack-plugin --save-dev
Настройка в webpack.config.js:
const { GenerateSW } = require('workbox-webpack-plugin');
module.exports = {
// ...другие настройки Webpack
plugins: [
new GenerateSW({
clientsClaim: true,
skipWaiting: true,
runtimeCaching: [
{
urlPattern: /\.(?:png|jpg|jpeg|svg|gif)$/,
handler: 'CacheFirst',
options: {
cacheName: 'images-cache',
expiration: {
maxEntries: 50,
maxAgeSeconds: 30 * 24 * 60 * 60,
},
},
},
{
urlPattern: /\.(?:js|css)$/,
handler: 'NetworkFirst',
options: {
cacheName: 'static-resources',
},
},
],
}),
],
};
Преимущества интеграции с Webpack:
precacheManifest).Workbox поддерживает интеграцию с Rollup, Parcel и другими сборщиками через плагинные системы. В большинстве случаев подход аналогичен Webpack:
Пример для Parcel (через конфигурацию
parcel-plugin-workbox):
// parcel-plugin-workbox добавляет автоматическую генерацию service-worker
// с учетом всех ресурсов сборки.
revision предотвращает устаревание кэша.Использование одного или комбинации этих методов позволяет гибко управлять кэшированием и улучшать производительность веб-приложений.