Някои тънкости при използването на обслужващи работници

някои

Предговор

Сервизните работници (простете ми читатели) днес са полезно допълнение към основната функционалност на сайта: тук и работят офлайн, и синхронизиране на фонови данни и модерни известия за натискане.

Множество обслужващи служители в един и същи домейн

Регистрацията на конкретен обслужващ работник има такова понятие като обхват. Той определя кои страници в даден домейн ще попаднат под негов контрол. В този случай можете да регистрирате няколко обслужващи служители в един и същи домейн, но с различен обхват. Ако се опитате да ги регистрирате с различни имена, но със същия обхват, тогава работникът, инсталиран по-късно, ще "замени" по-ранния си брат.

Между другото, за да може файлът по посочения път да бъде инсталиран като сервизен работник по горния път (това поведение е забранено по подразбиране, можете да увеличите пътя, да го намалите - не), тогава можете да използвате http заглавна част Сервизно-работник-разрешено.

Методът getRegistration () без параметри връща регистрация на сервизен работник, подходяща за текущата страница, вероятно неактивна. Това също означава, че по вложената пътека ще получим същата регистрация, ако не и по-подходяща. Това може да е неочаквано, ако се очаква да се изпълняват множество служители в един и същи домейн.

Помислете за пример: имаме инсталиран сервизен работник с обхват /. Нека бъде сайт за новини и ние предоставяме офлайн версии на текстовете. По пътя/администратора/има и контролен панел със собствен сервизен работник. Ако вторият сервизен работник все още не се е опитал да инсталира, тогава getRegistaration () ще върне регистрацията на първия сервизен работник и това може да доведе до грешки (например ще изпратим известия от администраторския панел до сервизен работник, който не е готов за тях изобщо).

getRegistration има незадължителен параметър - обхват. Ако го посочите, тогава методът ще върне регистрацията, която най-много съвпада (не е задължително да е равна) на предадения обхват. По този начин можем да се отпишем от обслужващи служители на вложени страници или да получим някакви регистрации изобщо от текущия домейн, просто трябва да знаем подходящия обхват.

И ако не знаем целия обхват, тогава съществува методът getRegistrations (), който просто връща всички регистрации от текущия домейн като масив. Необходим е Firefox или Chrome 45+.

Връзката между страницата и обслужващия работник

Възможността за обмен на данни между обслужващ работник и подстраница може да доведе до доста оригинални модели на работа. Например можете веднага да изпратите данни от кеша, като едновременно поискате нови; щом има нови данни - поставете ги в кеша и ги изпратете на страницата.

Примерът на serviceworke.rs показва лесен начин за комуникация със сервизен работник:


Тук контролерът е обслужващият работник, който контролира страницата. В последните браузъри (всички версии на Firefox и Chrome 51+) можете съвсем просто да отговорите на тази заявка:


В по-старите версии трябваше да преминете през всички раздели и да намерите правилния или дори да създадете MessageChannel на ръка. Също така вече имаме възможността да изпратим съобщение до раздела от събитието за извличане. Всичко това е описано в статията, с изключение на това, че вече имаме модерен api.

Друг момент е съхраняването на данни в сервизен работник. Хората, които са изпробвали обслужващи служители, може да са забелязали, че LocalStorage не е там. Това е така, защото обслужващите служители са поели курс към напълно асинхронен API (с изключение, може би, на importScripts). Но вътре все още са налични:

  • кешове
  • индексиран DB
  • само променливи, декларирани в контекста на работника (но те са краткотрайни и ще бъдат забравени, когато работникът по обслужването спре)

Както кешовете, така и indexedDB са достъпни по обичайния начин на страниците, като напълно споделят данни с работника. Ако се позовавате на предишния параграф, можете също да стигнете до заключението, че множество обслужващи служители от един и същ произход ще споделят данни! В този случай не е нужно да търкате кешовете на друг сервизен работник, например, като ги проверявате с префикса: