Sto tentando di implementare uno Service Worker
in una pagina di test. Il mio obiettivo finale è un'applicazione che funziona offline. La struttura della cartella è inferioreInformazioni sull'argomento Service Worker
/myApp
...
/static
/mod
/practice
service-worker.js
worker-directives.js
foopage.js
/templates
/practice
foopage.html
sto registrando un operaio di servizio, come illustrato di seguito (entro service-worker.js
):
navigator.serviceWorker.register('../static/mod/practice/service-worker.js').then(function(reg) {
console.log('Registration succeeded. Scope is ' + reg.scope);
...
}
e nella console vedo
Registration succeeded. Scope is https://example.com/static/mod/practice/
Se il mio pagina si trova a https://example.com/practice/foopage
, è necessario assicurarsi che il mio ambito service worker
sia https://example.com/practice/foopage
?
Se cerco di definire il campo di applicazione nella chiamata di funzione come register
navigator.serviceWorker.register('../static/mod/practice/service-worker.js', { scope: '/practice/foopage/' }).then(function(reg) {
...
}
ottengo l'errore
Registration failed with SecurityError: Failed to register a ServiceWorker: The path of the provided scope ('/practice/foopage/') is not under the max scope allowed ('/static/mod/practice/'). Adjust the scope, move the Service Worker script, or use the Service-Worker-Allowed HTTP header to allow the scope.
La domanda è: Che cosa significa esattamenteportata riferisce? È la raccolta di URL che il service worker
alla fine controllerà? Devo spostare service-workers.js
da qualche altra parte? Se sì, dove?
Non pensavo che un file 'js' nella directory radice era sempre qualcosa che sarebbe stato fatto. Ma con nuovi concetti arrivano nuovi paradigmi, immagino che –
penso che sia principalmente per ragioni di sicurezza. Se si ha accesso solo a '/ static', ma non alla root ('/'), ad esempio, il proprio service worker non dovrebbe essere in grado di intercettare le richieste alla root. – nils
Questo è solo parzialmente corretto: l'ambito determina quali pagine sono controllate dall'operatore del servizio. Una volta che una pagina è controllata da un operatore del servizio, * tutte * le richieste HTTP provenienti dalla pagina, indipendentemente dall'URL della richiesta, attiveranno l'evento 'fetch' dell'operatore del servizio. Quindi, se una pagina controllata fa una richiesta AJAX per 'https: // thirdpartyapi.com/api/test', il lavoratore di servizio avrà la possibilità di intercettarlo. –