workbox-streams предоставляет мощные возможности для
работы с потоками (Streams) в сервис-воркерах, позволяя
управлять загрузкой и обработкой данных в реальном времени. В отличие от
стандартных стратегий кэширования Workbox, которые оперируют с целыми
ответами, workbox-streams позволяет читать, изменять и
возвращать данные частями, что особенно полезно для больших файлов,
мультимедиа и потоковых ресурсов.
Streams API в JavaScript состоит из нескольких ключевых компонентов:
workbox-streams использует эти концепции для реализации
middleware в сервис-воркерах, которые могут перехватывать запросы и
изменять ответы до того, как они будут отправлены клиенту.
Для использования workbox-streams необходимо
импортировать его в сервис-воркер:
import { registerRoute } from 'workbox-routing';
import { streamResponse } from 'workbox-streams';
registerRoute – стандартная функция Workbox для
перехвата сетевых запросов.streamResponse – функция для создания потокового ответа
с обработчиками.streamResponse позволяет задавать массив
transformers — функций, которые последовательно изменяют поток
данных:
registerRoute(
({ request }) => request.destination === 'script',
({ request }) => {
return streamResponse({
request,
plugins: [],
transformers: [
new HTMLRewriter()
.on('script', {
element(element) {
element.setAttribute('defer', '');
}
})
]
});
}
);
Каждый transformer может быть объектом с методами:
chunk).Пример transformer, который конвертирует все текстовые данные в верхний регистр:
const upperCaseTransformer = {
transform(chunk, controller) {
controller.enqueue(new TextEncoder().encode(new TextDecoder().decode(chunk).toUpperCase()));
}
};
workbox-streams позволяет использовать стандартные
кэш-плагины Workbox вместе с потоками. Например, можно комбинировать
CacheFirst стратегию и потоковую обработку больших
файлов:
import { CacheFirst } from 'workbox-strategies';
import { CacheableResponsePlugin } from 'workbox-cacheable-response';
registerRoute(
({ request }) => request.destination === 'image',
({ request }) => {
return streamResponse({
request,
plugins: [
new CacheFirst({
cacheName: 'images-cache',
plugins: [
new CacheableResponsePlugin({ statuses: [0, 200] })
]
})
],
transformers: [
{
transform(chunk, controller) {
// Можно выполнять сжатие изображения или модификацию данных
controller.enqueue(chunk);
}
}
]
});
}
);
1. Модификация HTML на лету Потоки позволяют изменять HTML-контент перед его отправкой пользователю, например добавлять атрибуты или вставлять скрипты аналитики.
2. Потоковая обработка мультимедиа Можно изменять видеопотоки или аудио на лету, добавлять субтитры, фильтры или адаптивное качество без необходимости загружать весь файл сразу.
3. Сжатие и трансформация данных Подходит для больших JSON или CSV файлов, которые необходимо сжимать или фильтровать по определённым критериям перед отдачей клиенту.
Streams API и
контроля жизненного цикла данных.workbox-streams превращает сервис-воркер в полноценный
потоковый прокси, предоставляя гибкость для обработки данных на лету и
управления ресурсами с высокой точностью.