2016-06-30 3 views
3

У меня есть сайт, который имеет службы работника, как:обновить скрипты, импортированные с importScripts в сервисный работник

// Import a script from another domain 
importScripts('https://example.com/script.js') 

Предположим, что script.js обновляется с некоторым новым кодом и работником службы активируется за счет толкающего события (пользователь тем временем не посетил мой сайт снова).

importScripts проверяет наличие обновлений при каждом запуске сервисного работника или загружает script.js только один раз, когда рабочий-сервис впервые установлен?

Есть ли способ обновить код сервисного работника (и, в частности, импортированные сценарии) каждый раз, когда рабочий-сервис получает push-сообщение?

+0

Я написал [блог post] (http://blog.pushpad.xyz/2017/05/update-the-service-worker-and-the-scripts-imported-with-importscripts/) с некоторыми советами. – collimarco

ответ

2

С Service Workers specification скрипты, импортированные через importScripts, сохраняются на карте при установке/обновлении Service Worker и затем повторно используются до нового обновления. Там есть discussion on GitHub с более подробной информацией.

Я не могу придумать способ перезагрузки импортированных скриптов, когда рабочий-сервис получает push-сообщение. Каков ваш прецедент?

+0

Да, к сожалению, нет способа обновить импортированные скрипты. Единственным обходным решением является добавление фиктивного контента к основному рабочему коду. Это [пример использования] (http://blog.pushpad.xyz/2016/07/service-worker-importscripts-never-updates-scripts/). – collimarco

+0

Да, но даже тогда вы не можете заставить его обновляться при поступлении push-сообщения, не так ли? Менее уродливым обходным путем является использование «importScriptName-» + хэш содержимого импортированного скрипта + «.js» в качестве имени импортированного скрипта. Таким образом, содержимое сервисного работника изменится при изменении импортированного скрипта. – Marco

+0

Да, когда приходит push, он проверяет наличие обновлений (думаю, если последняя проверка обновлений была более чем за 24 часа до этого). Вы не можете легко генерировать хэш (импортированный скрипт принадлежит другому домену ...), и у людей могут быть статические веб-сайты (или активы). Я также ответил вам в блоге – collimarco

2

Можно заставить браузер повторно проверить/проверить, был ли обновлен код, включенный через importScripts(), путем динамического создания URL-адреса рабочего стола, если это изменяется каждый час, тогда браузер загрузит и установит «нового» рабочего, включая все импортированные скрипты.

Следующий код будет вызывать браузер для проверки всех зависимостей каждый час:

const MAXAGE = 3600; // seconds until recheck 
const URL = `/sw.js?q=${Math.floor(Date.now()/(MAXAGE * 1000))}`; 
navigator.serviceWorker.register(URL); 

Demo - откройте консоль JS и нажмите вокруг; вы должны увидеть, что импортированный скрипт перезагружается каждые 10 секунд.

(Это не решает полностью проблему (работник службы обновляется только, когда пользователь посещает страницу, не тогда, когда толчок уведомление принимается), но это может быть достаточно.)

+0

Более полный ответ на вопрос о том, как развертывать обновления для рабочих сервисов: http://stackoverflow.com/a/43471531 – mjs

Смежные вопросы