navigator.serviceWorker.ready не срабатывает, когда SW помещен в подпапку - PullRequest
0 голосов
/ 28 мая 2019

Наше приложение обслуживается (IIS в виртуальном приложении) от https://myserver.com/myapp

HTML-код, возвращаемый https://myserver.com/myapp:

<html>
  <!-- This file is served as a virtual application from https://myserver.com/myapp-->
  <head>
    <script src="/myapp/file.js"></script>
  </head>
<body>
</body>

Чтобы зарегистрировать сервис-работника, мне нужно добавить подпапку, как показано ниже

// This does not work since the app is served from /myapp
navigator.serviceWorker.register("/sw.js")  // Fail, will try loading https://myServer.com/sw.js

// This works (registration successful)
navigator.serviceWorker.register("/myapp/sw.js")  // This will register the sw.

Проблема возникает, когда я пытаюсь использовать серверную программу, которая ожидает события готовности:

// Inside of file.js
navigator.serviceWorker.ready.then(...) // Will not fire

Я предполагаю, что происходит то, что готовое событие не запускается, потому что работник сервиса «думает», что он установлен из подпапки с именем «MyApp», но когда файл file.js запускается и пытается использовать сервер работника, он выглядит как файл .js обслуживается из корня и, таким образом, выходит за рамки работы с серверами.

Есть идеи, как с этим справиться? Я попытался использовать параметр scope, но я думаю, что он используется только для ограничения области, а не для ее расширения.

{ scope: '/' } // Will fail with outside root error
{ scope: '/MyApp' } // Works, but still no ready event

Я уверен, что здесь что-то упущено, но я понятия не имею, что это такое.

1 Ответ

0 голосов
/ 28 мая 2019

Я нашел обходной путь, но все еще не уверен, почему готов не срабатывает.

navigator.serviceWorker.ready.then(function(reg){...}) // Will not fire

// Instead, assume registred and active, then this is a workaround
navigator.serviceWorker.getRegistrations().then(function ([reg]) {...})
...