В течение длительного времени в автономном режиме функциональность фоновой синхронизации и Push-уведомлений имеют дифференцированные нативные приложения из своих веб-аналогов. То Сервисный работник API. Это технология, изменяющая игрой, которая введет игровое поле. В этом руководстве мы будем использовать его, чтобы построить страницу, которая может служить контенту, даже пока нет подключения к Интернету.
Самый простой способ подумать о служебных работниках - это кусок кода, который устанавливается сайтом на клиентской машине, работает в фоновом режиме, и впоследствии позволяет запрограммировать запросы, отправленные на этот сайт, чтобы перехватить и манипулировать. Поскольку это такая мощная способность, чтобы работать с сервисными работниками в реальном времени, вы должны работать через HTTPS. Это гарантирует, что они не могут быть использованы, убедившись, что обслуживающий рабочий браузер получает со страницы, является подлинной.
Однако для целей развития мы можем запустить без HTTP с http: // localhost / разрешено как исключение из этого правила. Самый простой способ начать работу с НПМ http-server. упаковка.
NPM устанавливает HTTP-Server -G
HTTP-Server -P 8000 -C-1
Нет ничего на сервере прямо сейчас, поэтому давайте сделаем основную страницу для обслуживания. Мы создадим новый файл index.html, и когда мы запускаем сервер, он теперь будет доступен в http: // localhost: 8000 Отказ
На этом этапе вы обнаружите, что если вы завершаете HTTP-сервер и обновите страницу в браузере, вы получите страницу ошибки, поскольку сайт не может быть достигнут. Это полностью ожидается, поскольку мы еще не кэшировали какой-либо оффлайн контент.
& lt; otectype html & gt;
& lt; html & gt;
& lt; head & gt;
& lt; meta charset = "UTF-8" / & gt;
& lt; title & gt; сервисный работник & lt; / title & gt;
& lt; script src = "site.js" & gt; & lt; / script & gt;
& lt; link rel = "stylesheeet" type = "Text / CSS" href = "custom.css" & gt;
& lt; / head & gt;
& lt; body & gt;
& lt; header & gt;
& lt; h1 & gt; Добро пожаловать & lt; / h1 & gt;
& lt; / header & gt;
& lt; div id = "Содержание" и GT;
& lt; p & gt; содержание здесь & lt; / p & gt;
& lt; img src = "Kitty.jpg" ширина = "100%" и GT;
& lt; / div & gt;
& lt; / body & gt;
& lt; / html & gt;
У нас теперь есть довольно небрежная страница, и пришло время начать думать о внедрении сервисного работника. Прежде чем мы получим кодирование, стоит занять момент, чтобы понять жизненный цикл обслуживающих работников.
Процесс отключается с «оформлением» сервисного работника в вашем JavaScript, что говорит браузеру начать установку рабочего - первый шаг его жизненного цикла. На протяжении всего его жизненного цикла сервисный работник будет в одном из следующих состояний:
Давайте зарегистрируем сервисный работник. Это эффективно указывает браузер к файлу JavaScript, который определяет поведение работника обслуживания. Регистрация выполняется с использованием объекта ServiceWorker, который является точкой записи на API. Мы также проверяем API на самом деле в браузере, прежде чем пытаться сделать это.
То регистр() Функция может смело называться каждый раз, когда страница нагрузки, а браузер определит, был ли обслуживающий рабочий уже зарегистрирован.
Если («ServiceWorker» в навигаторе) {
window.addeventListener («нагрузка», функция () {
Navigator.serviceWorker.register («ServiceWorker.js», {Scope: './' itly {).
Console.log («Сервисский работник успешно зарегистрирован».);
}, функция (ошибка) {
Console.log («Ошибка регистрации сервиса:« + ошибка);
});
});
}
Далее нам нужно для реализации самого работника услуг. Работники обслуживания могут слушать ряд событий, связанных с их собственным жизненным циклом и активностью на странице. Наиболее важными из них устанавливаются, активируют и извлекают.
Давайте начнем с создания слушателя для установить Событие, которое запускается после завершения установки работника. Это позволяет нам поручить обслуживающему работнику добавить несколько автономных контента в текущей папке к кэше. Нам также нужно назвать наш кеш - поскольку старые кеши могут сохраняться, обновление / версию это имя кэша позволяет вам подавать новые версии контента позже.
var ceencache = 'демо-кеш';
self.addeventListener («Установка», событие = & GT; {
Event.waituntil (
Caches.Open (CurrentCache). Затем (функция (кэш) {
console.log («Добавление содержимого в кэш».);
return cache.addall ([
'./index_offline.html',
'./kitty_offline.jpg',
'./Пользовательские CSS'
]);
})
);
});
Наша страница теперь будет кэшировать содержимое при загрузке, но нам нужен некоторый механизм для перехвата запросов и перенаправить их к этому кеше. Для этого нам нужно слушать принести события, которые срабатывают, когда запрос, такой как получение нашего index.html. Файл сделан по всей сети. Затем мы сопоставляем запрос к кэше и обслуживаете кэшированный ресурс, если он найден. В противном случае мы возвращаемся к запросу Fetch API на сервер.
На этот момент стоит отметить, что у нас есть тяжелая зависимость от JavaScript обещает работать. Это может быть немного сложно, поэтому стоит ознакомиться с тем, если вы не использовали их раньше.
Self.AddeventListener ('fetch', event = & gt; {
событие. Оспомнить (
Caches.match (Event.Request). Затем (ответ = & gt; {
Обратный ответ || fetch (event.request);
})
);
});
Если вы проверяете его сейчас (завершайте HTTP-сервер и обновите страницу), вы должны обнаружить, что ваша страница работает как онлайн, так и в автономном режиме. Однако, вероятно, то, что вам захочется более интеллектуальным в автономном поведении, с различным содержанием или функциональностью, доступными, когда сервер недоступен.
Для достижения этого мы можем продлить наш принести Реакция события дополнительно проверять конкретно для навигационных запросов и отвечать на разные автономные страницы, когда вы обнаружены. Этот index_offline.html. Файл может быть вариантом вашей онлайн-страницы или что-то совершенно другое, а также может использовать другие ресурсы, которые вы кэшировали, такие как Пользовательские CSS Отказ
Self.AddeventListener ('fetch', event = & gt; {
Если (event.request.mode === 'навигация') {
событие. Оспомнить (
fetch (event.request) .catch (ошибка = & gt; {
console.log ("страница недоступна. Возвращение оффлайн контента");
Возврат Caches.match ('./ index_offline.html');
})
);
} еще {
событие. Оспомнить (
Caches.match (Event.Request). Затем (ответ = & gt; {
Обратный ответ || fetch (event.request);
})
);
}
});
Есть еще одна вещь, которую нам нужно. Если вы сейчас попробуйте изменить свой автономный контент, вы обнаружите, что он не обновляется, когда вы проверяете свою страницу - вы все еще получаете старую версию! Это потому, что старые файлы все еще кэшируются.
Вам необходимо реализовать что-то, чтобы очистить устаревшие файлы из кэша, чтобы предотвратить их обслуживание. Это делается, отвечая на активировать Событие и удаление всех кэшей, которые не соответствуют имени, указанному в CurrentCache. Затем вы можете добавить номер версии в CurrentCache каждый раз, когда вы измените свой автономный контент, чтобы убедиться, что он обновляется.
IS.addeventListener («активация», событие = & GT; {
var activecaches = [currentcache];
Console.log (активированный сервисный работник. Проверка кеша обновляется. »);
Event.waituntil (
cachees.keys (). Затем (кейлист = & gt; {
Вернуть Promise.all (Keylist.Map (Key = & GT; {
Если (activeCaches.indexof (ключ) === -1) {
console.log («Удаление старого кэша» + ключ);
Возврат кэши. Оделет (ключ);
}
}));
})
);
});
Эта статья была опубликована в журнале Web Designer # 268. Подпишись сейчас.
Прочитайте больше:
В реальной фотографии лучи света на их самых заметных, когда у них есть..
Я был огромным поклонником манги с детства, и нельзя скрывать влияние, ..
Использование купольных огней было одним из величайших достижений в с..
Я всегда думал, что оригинальность найдена где-то между тем, что вам нр�..
Для этого семинара я буду делать вам шаг за шагом через одну из моих ка�..
Отзывчивая веб-типография жесткая - вам нужно иметь как дизайнерские отбивные, так и технические ноу-хау..
Аффинность фото для iPad является великим редактор фото , ..
Когда попросили сделать семинар по созданию фэнтезийной среды, я поду�..