Максим Сальников
@webmaxru
Как создавать быстрые, автономные, удобные веб-приложения
Full-stack разработчик "приложений из будущего" в ForgeRock
... используют последние веб-технологии
... сочетают функции большинства современных браузеров с преимуществами мобильных платформ
Работает во всех браузерах
Легко находится
Можно дать на него ссылку
Похоже на приложение
Подстраивается под устройство
Может работать автономно
Может напоминать о себе
Устанавливается
Всегда последней версии
Безопасное
Приложение
Сервис-воркер
'install'
Загрузка
Установка
Активация
Удален
'activate'
Ожидание
Активен
стремящийся к прогрессу, проникнутый передовыми идеями
постепенно возрастающий, увеличивающийся
if ('serviceWorker' in navigator) {
// Регистрируем сервис-воркер
}
if ('SyncManager' in window) {
// Реализуем функциональность для оффлайн-режима
}
if (!('PushManager' in window)) {
// Прячем интерфейс подписки на push-уведомления
}
if ('actions' in Notification.prototype) {
// Можем использовать кнопки с разными действиями
}
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw-workbox.js')
.then(...);
}
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('/sw-workbox.js')
.then(...);
)};
}
platformBrowserDynamic()
.bootstrapModule(AppModule)
.then(() => {
// Регистрация сервис-воркера
});
self.addEventListener('install', () => {
self.skipWaiting();
});
self.addEventListener('activate', () => {
self.clients.matchAll({type: 'window'}).then(tabs => {
tabs.forEach(tab => {
tab.navigate(tab.url);
});
});
});
Cache-Control: max-age=0
navigator.serviceWorker.getRegistrations()
.then((registrations) => {
for(let registration of registrations) {
registration.unregister()
}
})
const appShellFilesToCache = [
...
'./non-existing.html'
]
self.addEventListener('install', (event) => {
event.waitUntil(
caches.open(cacheName).then((cache) => {
return cache.addAll(appShellFilesToCache)
})
)
})
Chrome | <6% своб. пространства |
Firefox | <10% своб. пространства |
Safari | <50MB |
IE10 | <250MB |
Edge | Зависит от размера диска |
const appShellFilesToCache = [
...
'https://workboxjs.org/offline-ga.min.svg'
]
self.addEventListener('install', (event) => {
event.waitUntil(
caches.open(cacheName).then((cache) => {
return cache.addAll(appShellFilesToCache)
})
)
})
const noCorsRequest =
new Request('https://workboxjs.org/offline-ga.svg', {
mode: 'no-cors'
});
fetch(noCorsRequest)
.then(response => cache.put(noCorsRequest, response));
self.addEventListener('install', (event) => {
event.waitUntil(
caches.open(cacheName).then((cache) => {
return cache.addAll(appShellFilesToCache)
})
)
})
const appShellFilesToCache = [
...
'./assets/redirect/redirectfrom.html'
]
app.get('/assets/redirect/redirectfrom.html', (req, res) => {
res.redirect(301, '/assets/redirect/redirectto.html')
})
// If "cleanRedirects" and this is a redirected response,
// then get a "clean" copy to add to the cache.
const newResponse = cleanRedirects && response.redirected ?
await cleanResponseCopy({response}) :
response.clone();
const env = {
// Environment polyfills
skipWaiting: Function,
caches: CacheStorage,
clients: Clients,
registration: ServiceWorkerRegistration,
addEventListener: Function,
Request: constructor Function,
Response: constructor Function,
URL: constructor Function
};
Открыта регистрация на ваш рейс
MyAirline
myairline.com
Ваш рейс
MY 1228
Отправление
21.09 13:45
Нажмите здесь, чтобы зарегистрироваться
myairline.com
navigator.serviceWorker.ready.then((registration) => {
registration.periodicSync.register({
tag: 'get-latest-news', // default: ''
minPeriod: 12 * 60 * 60 * 1000, // default: 0
powerState: 'avoid-draining', // default: 'auto'
networkState: 'avoid-cellular' // default: 'online'
}).then((periodicSyncReg) => {
// Задача успешно зарегистрирована
})
});
self.addEventListener('periodicsync', function(event) {
if (event.registration.tag == 'get-latest-news') {
event.waitUntil(fetchAndCacheLatestNews());
}
else {
// Неизвестная задача, лучше отменить регистрацию
event.registration.unregister();
}
});