чтоService Worker
Service Worker
По существу действует как прокси-сервер между веб-приложением и браузером, а также может действовать как прокси-сервер между браузером и сетью, когда сеть доступна. Они предназначены (среди прочего) для обеспечения эффективного автономного взаимодействия, перехвата сетевых запросов и выполнения соответствующих действий в зависимости от того, доступна ли сеть и находится ли обновленный ресурс на сервере. Они также разрешают доступ к push-уведомлениям и фоновой синхронизации.API
.
-
Service Worker
Суть - этоWeb Worker
, который не зависит отJavaScript
основной поток, поэтому он не может получить прямой доступDOM
, и вы не можете получить прямой доступwindow
объект, однакоService Worker
может получить доступnavigator
объектов или путем передачи сообщений (postMessage)а такжеJavaScript
Общение основного потока. -
Service Worker
это веб-прокси, который контролируетWeb
Все сетевые запросы для страницы. -
Service Worker
Имеет свой жизненный цикл, используйте его правильноService Worker
Главное — гибко управлять его жизненным циклом.
Service Worker
роль
- для кеширования браузера
- Не в сети
Web APP
- сообщение
Service Worker
совместимость
Service Worker
это расширенная функция современных браузеров, основанная наfetch API
,Cache Storage
,Promise
др., из нихCache
при условииRequest / Response
Механизм хранения пар объектов,Cache Storage
хранить несколькоCache
.
Пример
в пониманииService Worker
Прежде чем принцип, давайте посмотрим на параграфService Worker
Пример:
self.importScripts('./serviceworker-cache-polyfill.js');
var urlsToCache = [
'/',
'/index.js',
'/style.css',
'/favicon.ico',
];
var CACHE_NAME = 'counterxing';
self.addEventListener('install', function(event) {
self.skipWaiting();
event.waitUntil(
caches.open(CACHE_NAME)
.then(function(cache) {
return cache.addAll(urlsToCache);
})
);
});
self.addEventListener('fetch', function(event) {
event.respondWith(
caches.match(event.request)
.then(function(response) {
if (response) {
return response;
}
return fetch(event.request);
})
);
});
self.addEventListener('activate', function(event) {
var cacheWhitelist = ['counterxing'];
event.waitUntil(
caches.keys().then(function(cacheNames) {
return Promise.all(
cacheNames.map(function(cacheName) {
if (cacheWhitelist.indexOf(cacheName) === -1) {
return caches.delete(cacheName);
}
})
);
})
);
});
Далее начинается анализ по разделам, раскрываяService Worker
Тайна:
polyfill
Сначала посмотрите на первую строку:self.importScripts('./serviceworker-cache-polyfill.js');
, представлено здесьCache APIодин изpolyfill,этоpolyfill
Поддержка делает его также доступным в браузерах более ранних версий.Cache Storage API
. хочу достичьService Worker
функция, как правило, должна соответствоватьCache API
Проксировать сетевые запросы в кеш.
существуетService Worker
нить, использоватьimportScripts
представлятьpolyfill
Скрипт для совместимости с браузерами более ранних версий.
Cache Resources List
And Cache Name
После этого используйтеurlsToCache
Список для объявления статических ресурсов, которые необходимо кэшировать, а затем используйте переменнуюCACHE_NAME
определить текущий кешCache Storage Name
, что можно понимать какCache Storage
ЯвляетсяDB
,а такжеCACHE_NAME
являетсяDB
имя:
var urlsToCache = [
'/',
'/index.js',
'/style.css',
'/favicon.ico',
];
var CACHE_NAME = 'counterxing';
Lifecycle
Service Worker
независимый от браузераJavaScript
Основной поток имеет свой независимый жизненный цикл.
Если вам нужно установить на сайтService Worker
, тебе следуетJavaScript
Представлен в основном потоке с использованием следующего кодаService Worker
.
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js').then(function(registration) {
console.log('成功安装', registration.scope);
}).catch(function(err) {
console.log(err);
});
}
Здесь мы должны обратить вниманиеsw.js
Путь к файлу, в моем примере под текущим корнем домена, значит,Service Worker
Он имеет то же происхождение, что и веб-сайт, и может действовать как прокси для всех запросов текущего веб-сайта, еслиService Worker
быть зарегистрированным в/imaging/sw.js
down, это может быть только прокси/imaging
следующие сетевые запросы.
можно использоватьChrome
консоль, просмотреть текущую страницуService Worker
условие:
После завершения установкиService Worker
Пройдет следующий жизненный цикл:
- скачать(
download
) - Установить(
install
) - активация(
activate
)
-
первый визит пользователя
Service Worker
При управлении веб-сайтом или страницейService Worker
будут загружены немедленно. По крайней мере после каждого24
Он будет загружаться один раз в час. Он может загружаться чаще, но каждый24
Час гарантированно будет загружен один раз, чтобы плохие скрипты не действовали в течение длительного времени. -
После завершения загрузки запустите установку
Service Worker
На этапе установки обычно ресурсы, которые нам нужны для кэширования некоторых статических данных, предварительно объявленных, в нашем примере,urlsToCache
Предварительно объявить. -
После завершения установки начнется активация, и браузер попытается загрузить
Service Worker
После того, как файл скрипта будет успешно загружен, он будет таким же, как ранее кэшированныйService Worker
Файл скрипта сравнивается, если он сравнивается с предыдущимService Worker
Файлы скриптов разные, что доказываетService Worker
был обновлен и сработаетactivate
мероприятие. Полная активация.
Как показано на рисунке, дляService Worker
Примерный жизненный цикл:
install
После установки попробуйте закешировать некоторые статические ресурсы:
self.addEventListener('install', function(event) {
self.skipWaiting();
event.waitUntil(
caches.open(CACHE_NAME)
.then(function(cache) {
return cache.addAll(urlsToCache);
})
);
});
первый,self.skipWaiting()
Выполнить, скажите браузеру пропустить стадию ожидания напрямую и удалить просроченныеsw.js
изService Worker
скрипт, сразу начните пытаться активировать новыйService Worker
.
затем используйтеcaches.open
открыть одинCache
, после открытия пройтиcache.addAll
Попробуйте кэшировать наши предварительно объявленные статические файлы.
мониторfetch
Запросы прокси-сети
Все сетевые запросы на страницу пройдутService Worker
изfetch
триггер события,Service Worker
пройти черезcaches.match
попробовать изCache
Найдите кеш в кеше, если кеш попадет, то сразу вернётся в кешresponse
, в противном случае создайте настоящий сетевой запрос.
self.addEventListener('fetch', function(event) {
event.respondWith(
caches.match(event.request)
.then(function(response) {
if (response) {
return response;
}
return fetch(event.request);
})
);
});
Если нам нужно отправить запрос наCache Storage
добавить новый кеш вcache.put
для добавления, см. следующий пример:
self.addEventListener('fetch', function(event) {
event.respondWith(
caches.match(event.request)
.then(function(response) {
// 缓存命中
if (response) {
return response;
}
// 注意,这里必须使用clone方法克隆这个请求
// 原因是response是一个Stream,为了让浏览器跟缓存都使用这个response
// 必须克隆这个response,一份到浏览器,一份到缓存中缓存。
// 只能被消费一次,想要再次消费,必须clone一次
var fetchRequest = event.request.clone();
return fetch(fetchRequest).then(
function(response) {
// 必须是有效请求,必须是同源响应,第三方的请求,因为不可控,最好不要缓存
if (!response || response.status !== 200 || response.type !== 'basic') {
return response;
}
// 消费过一次,又需要再克隆一次
var responseToCache = response.clone();
caches.open(CACHE_NAME)
.then(function(cache) {
cache.put(event.request, responseToCache);
});
return response;
}
);
})
);
});
В проекте необходимо обратить внимание на управление кешем, вообще не рекомендуется кешировать интерфейсные запросы. Так что в моем собственном проекте здесь нет схемы динамического кэширования.
activate
Service Worker
Всегда есть день, который нужно обновить.С итерацией версии, однажды нам нужно выпустить функции новой версии онлайн.В это время нам нужно устранить старый кеш и старый кеш.Service Worker
а такжеCache Storage
Как это устранить?
self.addEventListener('activate', function(event) {
var cacheWhitelist = ['counterxing'];
event.waitUntil(
caches.keys().then(function(cacheNames) {
return Promise.all(
cacheNames.map(function(cacheName) {
if (cacheWhitelist.indexOf(cacheName) === -1) {
return caches.delete(cacheName);
}
})
);
})
);
});
- Сначала есть белый список, в белом списке
Cache
не устраняется. - проходить после
caches.keys()
получить всеCache Storage
, поставить не в белый списокCache
неиспользование. - устаревшее использование
caches.delete()
метод. он получаетcacheName
в качестве аргумента удалитеcacheName
Все тайники.
sw-precache-webpack-plugin
sw-precache-webpack-pluginЯвляетсяwebpack plugin
, который можно настроить вwebpack
Генерировать то, что мы хотим, при упаковкеsw.js
изService Worker
сценарий.
Простейшая конфигурация выглядит следующим образом:
var path = require('path');
var SWPrecacheWebpackPlugin = require('sw-precache-webpack-plugin');
const PUBLIC_PATH = 'https://www.my-project-name.com/'; // webpack needs the trailing slash for output.publicPath
module.exports = {
entry: {
main: path.resolve(__dirname, 'src/index'),
},
output: {
path: path.resolve(__dirname, 'src/bundles/'),
filename: '[name]-[hash].js',
publicPath: PUBLIC_PATH,
},
plugins: [
new SWPrecacheWebpackPlugin(
{
cacheId: 'my-project-name',
dontCacheBustUrlsMatching: /\.\w{8}\./,
filename: 'service-worker.js',
minify: true,
navigateFallback: PUBLIC_PATH + 'index.html',
staticFileGlobsIgnorePatterns: [/\.map$/, /asset-manifest\.json$/],
}
),
],
}
в исполненииwebpack
После упаковки файл с именемservice-worker.js
файл для кэшированияwebpack
Упакованные статические файлы.
один из самых простыхПример.
Service Worker Cache
VS Http Cache
ПростиHttp Header
кеш,Service Worker
СотрудничатьCache Storage
Есть у него и свои преимущества:
- Кэш и обновление сосуществуют: каждый раз, когда версия обновляется, с помощью
Service Worker
Вы можете использовать кеш для немедленного возврата, но в то же время вы можете инициировать запрос, чтобы проверить, есть ли обновление новой версии. - Ненавязчивый:
hash
Значение действительно уродливое. - Не легко смывается:
Http
Кэш легко очищается и срок его действия истекает, в то время какCache Storage
не легко смывается. Также нет срока годности. - Офлайн: с помощью
Service Worker
Возможен оффлайн доступ к приложениям.
Но недостаток в том, что потомуService Worker
зависит отfetch API
, зависит отPromise
,Cache Storage
Подождите, совместимость не очень.
позже
Эта статья просто суммируетService Worker
Основное использование и использованиеService Worker
Однако простой способ кэширования на стороне клиентаService Worker
намного больше, например:Service Worker
Для автономных приложений, для загрузки сетевых приложений (см.push-notifications)Ждать.
даже с помощьюService Worker
, кешировать интерфейс, в моем проекте это не так уж и сложно. Однако преимущество кэширования интерфейса заключается в том, что оно поддерживает автономный доступ, и мы также можем нормально обращаться к нашему веб-сайту в автономном режиме.Web
заявление.
Cache Storage
а такжеService Worker
всегда неразделим.Service Worker
Лучшее использование на самом деле сотрудничатьCache Storage
Займитесь автономным кэшированием. посредствомService Worker
, вы можете легко управлять сетевыми запросами и применять разные стратегии для разных сетевых запросов. Например дляCache
стратегии, на самом деле, есть много ситуаций. Например, сетевой запрос может использоваться первым, а кеш может использоваться при сбое сетевого запроса, или кеш и сетевой запрос могут использоваться одновременно.С одной стороны проверяется запрос, а с другой с другой стороны проверяется кеш, а потом будет использован тот, кто быстрее.