Workbox — это набор библиотек и инструментов для упрощения реализации сервис-воркеров и кэширования ресурсов в веб-приложениях. В контексте микрофронтендов его использование позволяет эффективно управлять кэшированием отдельных модулей, минимизируя дублирование ресурсов и ускоряя загрузку отдельных частей приложения.
Для начала необходимо установить пакет:
npm install workbox-cli workbox-sw workbox-build
В проекте с микрофронтендами сервис-воркер должен быть сконфигурирован так, чтобы обслуживать каждый модуль отдельно, но при этом поддерживать общий кэш для общих библиотек.
import {precacheAndRoute} from 'workbox-precaching';
import {registerRoute} from 'workbox-routing';
import {StaleWhileRevalidate} from 'workbox-strategies';
precacheAndRoute(self.__WB_MANIFEST);
registerRoute(
({request}) => request.destination === 'script' || request.destination === 'style',
new StaleWhileRevalidate({
cacheName: 'static-resources',
})
);
Каждый микрофронтенд может иметь собственный сервис-воркер или общий для всех модулей. Оптимальная стратегия — комбинировать два подхода:
registerRoute(
({url}) => url.pathname.startsWith('/mf1/'),
new StaleWhileRevalidate({
cacheName: 'mf1-cache',
})
);
registerRoute(
({url}) => url.pathname.startsWith('/mf2/'),
new StaleWhileRevalidate({
cacheName: 'mf2-cache',
})
);
Такой подход предотвращает лишнее перезаписывание кэшей при обновлении одного микрофронтенда, не затрагивая остальные.
Workbox поддерживает стратегию управления версиями через
precacheAndRoute. Для микрофронтендов это критично, так как
обновления одного модуля не должны ломать работу других.
precacheAndRoute([
{url: '/mf1/main.js', revision: '12345'},
{url: '/mf2/main.js', revision: '67890'},
]);
В случае обновления ревизия меняется, и сервис-воркер автоматически подхватывает новую версию файла. Это предотвращает «битые» кэши и гарантирует корректную работу всего приложения.
StaleWhileRevalidate — часто используется для скриптов и стилей, так как позволяет показывать пользователю кэшированную версию, одновременно обновляя её на фоне.
CacheFirst — подходит для редко обновляемых ресурсов: изображения, шрифты, CDN-библиотеки.
NetworkFirst — полезно для данных, где приоритетом является свежесть контента, например, API-запросы к микрофронтендам.
registerRoute(
({url}) => url.pathname.startsWith('/api/'),
new NetworkFirst({
cacheName: 'api-cache',
networkTimeoutSeconds: 3,
plugins: [
// Можно добавить Workbox plugin для управления сроком жизни кэша
],
})
);
Для микрофронтендов критично избегать дублирования библиотек в кэше. Workbox позволяет вынести общий кэш для всех микрофронтендов:
registerRoute(
({url}) => url.pathname.startsWith('/libs/'),
new CacheFirst({
cacheName: 'shared-libs',
})
);
Это снижает трафик и ускоряет загрузку страниц при навигации между микрофронтендами.
Workbox CLI и Webpack-плагины позволяют автоматически генерировать сервис-воркеры и манифесты кэширования. Для микрофронтендов важно включать опцию разделения манифестов по модулю:
const {injectManifest} = require('workbox-build');
injectManifest({
swSrc: './src/service-worker.js',
swDest: './dist/service-worker.js',
globDirectory: './dist',
globPatterns: ['mf1/**.js', 'mf2/**.js', 'libs/**.js'],
});
Это обеспечивает контроль версий и минимизирует вероятность конфликта между различными модулями.
Workbox предоставляет события для контроля жизненного цикла сервис-воркера. В микрофронтендах это позволяет инициировать обновление только тех модулей, которые были изменены:
self.addEventListener('message', (event) => {
if (event.data && event.data.type === 'SKIP_WAITING') {
self.skipWaiting();
}
});
Сервис-воркер можно программно активировать для конкретного микрофронтенда, не влияя на остальное приложение.
Эти принципы позволяют строить масштабируемые микрофронтенд-приложения с Workbox, минимизируя проблемы с кэшированием, обеспечивая быструю загрузку и управляемое обновление отдельных модулей.