Основная цель sw-precache —
автоматическая генерация Service Worker для кэширования ресурсов
веб-приложения, что позволяет обеспечивать оффлайн-доступ и повышать
производительность за счет предварительного кэширования статических
файлов. Для эффективного использования библиотеки важно правильно
организовать структуру проекта.
В корне проекта обычно располагаются следующие элементы:
/project-root
├── package.json
├── gulpfile.js / webpack.config.js
├── src/
├── dist/
└── sw.js (опционально)
package.json — содержит зависимости
проекта, включая sw-precache.gulpfile.js или
webpack.config.js — конфигурационные файлы для
сборки, в которых интегрируется генерация Service Worker.src/ — исходные файлы проекта (HTML,
CSS, JS, изображения).dist/ — сборка проекта, готовая к
деплою.sw.js — файл Service Worker, может
создаваться автоматически или частично настраиваться вручную.В src/ рекомендуется придерживаться следующей
структуры:
/src
├── index.html
├── scripts/
│ └── main.js
├── styles/
│ └── main.css
└── images/
├── logo.png
└── icons/
После сборки проект в dist/ должен иметь структуру,
близкую к исходной, но с оптимизированными и минифицированными
файлами:
/dist
├── index.html
├── scripts/
│ └── main.min.js
├── styles/
│ └── main.min.css
├── images/
└── sw.js
sw-precache и содержит
манифест кэшируемых ресурсов.sw-precacheКонфигурация может храниться отдельным файлом
sw-precache-config.js:
module.exports = {
staticFileGlobs: [
'dist/**/*.html',
'dist/scripts/**/*.js',
'dist/styles/**/*.css',
'dist/images/**/*.{png,jpg,gif,svg}'
],
stripPrefix: 'dist/',
runtimeCaching: [
{
urlPattern: /\/api\//,
handler: 'networkFirst'
}
]
};
staticFileGlobs — указывает, какие
файлы должны быть закэшированы при установке Service Worker.stripPrefix — удаляет часть пути для
корректного отображения в кэше.runtimeCaching — динамическое
кэширование ресурсов при запросах к серверу, полезно для API.Пример Gulp-задачи для генерации Service Worker:
const gulp = require('gulp');
const swPrecache = require('sw-precache');
gulp.task('generate-service-worker', function(callback) {
swPrecache.write('dist/sw.js', {
staticFileGlobs: [
'dist/**/*.html',
'dist/scripts/**/*.js',
'dist/styles/**/*.css',
'dist/images/**/*.{png,jpg,gif,svg}'
],
stripPrefix: 'dist/'
}, callback);
});
sw.js на основе собранных файлов.runtimeCaching, для сложных приложений.Для Webpack можно использовать плагин
sw-precache-webpack-plugin:
const SWPrecacheWebpackPlugin = require('sw-precache-webpack-plugin');
module.exports = {
entry: './src/scripts/main.js',
output: {
path: __dirname + '/dist',
filename: 'scripts/main.js'
},
plugins: [
new SWPrecacheWebpackPlugin({
cacheId: 'my-app',
filename: 'sw.js',
staticFileGlobs: ['dist/**/*.{js,html,css,png,jpg,gif,svg}'],
stripPrefix: 'dist/'
})
]
};
sw.js во время
сборки.stripPrefix — упрощает
пути и предотвращает ошибки при регистрации Service Worker.Эта структура позволяет поддерживать проект в чистом, модульном виде
и обеспечивает корректную работу sw-precache для
кэширования как статических, так и динамических ресурсов.