Sw-precache — это инструмент для автоматической генерации сервис-воркеров, который позволяет кэшировать ресурсы веб-приложения и обеспечивать его работу в оффлайн-режиме. Однако при работе с cross-origin ресурсами (ресурсами, находящимися на другом домене) возникают определённые ограничения, продиктованные спецификациями браузеров и политикой безопасности CORS.
При попытке кэшировать ресурсы, загруженные с другого домена, браузеры применяют политику Cross-Origin Resource Sharing (CORS).
Access-Control-Allow-Origin, Sw-precache может безопасно
его кэшировать и использовать при последующих обращениях.Пример проблемы:
// Попытка кэшировать внешний ресурс без CORS
swPrecache.write('service-worker.js', {
staticFileGlobs: [
'https://cdn.example.com/library.js'
]
});
В этом случае при установке сервис-воркера браузер выдаст ошибку
OpaqueResponse или отклонит кэширование, потому что ответ
нельзя безопасно прочитать.
Sw-precache позволяет кэшировать ресурсы с cross-origin
через опцию ignoreUrlParametersMatching и работу с
opaque-ответами. Opaque-ответ — это ответ, тело которого
недоступно сервис-воркеру, но браузер может хранить его в кэше и
отдавать клиенту.
Особенности opaque-ответов:
Пример конфигурации:
swPrecache.write('service-worker.js', {
staticFileGlobs: [
'dist/**/*.{js,css,html}',
'https://cdn.example.com/library.js'
],
stripPrefix: 'dist/',
handleFetch: true
});
Для внешних ресурсов рекомендуется проверять, что сервер поддерживает
Access-Control-Allow-Origin: *, чтобы сервис-воркер мог
безопасно использовать их содержимое без ограничений.
Отсутствие контроля версий С opaque-ответами сервис-воркер не видит содержимое, поэтому невозможно определить, изменился ли ресурс. Это может привести к использованию устаревшей версии при обновлении приложения.
Нет возможности применения стратегии «stale-while-revalidate» Для ресурсов без CORS сервис-воркер не сможет одновременно отдавать кэшированную версию и проверять наличие новой на сервере.
Ошибки при модификации ответов Любые попытки изменить opaque-ответ, например добавить заголовки или преобразовать в JSON, приведут к сбоям.
Access-Control-Allow-Origin.const swPrecache = require('sw-precache');
swPrecache.write('service-worker.js', {
staticFileGlobs: [
'dist/**/*.{js,css,html}',
'https://cdn.example.com/fonts/*.woff2'
],
stripPrefix: 'dist/',
runtimeCaching: [
{
urlPattern: /^https:\/\/cdn\.example\.com\/fonts\//,
handler: 'cacheFirst',
options: {
cache: {
maxEntries: 20,
name: 'cdn-fonts-cache'
},
fetchOptions: {
mode: 'cors'
}
}
}
]
});
В этом примере сервис-воркер кэширует шрифты с внешнего CDN,
используя cacheFirst стратегию и CORS-запросы, что
позволяет безопасно работать с кросс-доменными ресурсами и
минимизировать ошибки при их обновлении.