Sourcemap — это файл, который позволяет браузеру сопоставлять скомпилированный или минифицированный код с исходным исходником. В контексте сервис-воркеров это особенно важно для отладки: без sourcemap стек вызовов и ошибки будут указывать на минифицированный код, что значительно усложняет диагностику.
В Workbox настройка sourcemap начинается с конфигурации сборщика (Webpack, Rollup или другой). По умолчанию Workbox использует сгенерированные JavaScript-файлы сервис-воркера, и если в процессе сборки не включен генератор sourcemap, ошибки в runtime будут трудно интерпретировать.
Workbox интегрируется с Webpack через плагин
WorkboxWebpackPlugin. Для генерации sourcemap необходимо
включить соответствующие опции как в Webpack, так и в самом Workbox:
const { GenerateSW } = require('workbox-webpack-plugin');
module.exports = {
mode: 'production',
devtool: 'source-map', // Включение генерации sourcemap для сборки
plugins: [
new GenerateSW({
swDest: 'service-worker.js',
sourcemap: true, // Специфическая опция Workbox для включения sourcemap
clientsClaim: true,
skipWaiting: true
})
]
};
Ключевые моменты:
devtool: 'source-map' — основной механизм Webpack для
генерации sourcemap.sourcemap: true в Workbox необходима для того,
чтобы ссылочный комментарий на sourcemap был добавлен в финальный
service-worker.js.В случае использования Rollup, настройка sourcemap для сервис-воркера
происходит через rollup-plugin-workbox или обычный
rollup-plugin-terser. Пример конфигурации:
import { generateSW } from 'rollup-plugin-workbox';
import { terser } from 'rollup-plugin-terser';
export default {
input: 'src/service-worker.js',
output: {
file: 'dist/service-worker.js',
format: 'iife',
sourcemap: true // Генерация sourcemap Rollup
},
plugins: [
terser({
format: {
comments: false
},
sourcemap: true
}),
generateSW({
swDest: 'dist/service-worker.js',
sourcemap: true
})
]
};
Особенности:
sourcemap: true в output.terser не уничтожает sourcemap при
правильной настройке.После настройки сборки браузеры автоматически подхватывают sourcemap при подключении сервис-воркера. Для проверки:
Application → Service Workers.Sources появится дерево исходных
файлов вместо минифицированного кода.Иногда возникает ситуация, когда финальный
service-worker.js находится в другой директории, а браузер
не может найти sourcemap. Для корректной работы необходимо:
//# sourceMappingURL=service-worker.js.map корректно
указывает на расположение файла.Sourcemap увеличивает размер файла, что критично для сервис-воркера, так как он загружается при каждой регистрации. В продакшн-сборках рекомендуется:
development).new GenerateSW({
swDest: 'service-worker.js',
clientsClaim: true,
skipWaiting: true,
sourcemap: process.env.NODE_ENV === 'development'
});
Если сервис-воркер содержит inline-скрипты, можно добавить директиву
//# sourceURL=имя_файла для улучшения трассировки:
self.addEventListener('fetch', event => {
console.log('Fetch event', event);
});
//# sourceURL=service-worker.js
Это особенно полезно при динамическом формировании сервис-воркера через шаблоны или сборщики.
injectManifest и кастомного
сервис-воркера убедиться, что исходный файл указан корректно, а опция
sourcemap: true не конфликтует с плагинами
минификации.