Das Problem, auf das ich gestoßen bin, als ich versucht habe, auf meinem Server zu veröffentlichen, ist, dass die service-worker.js Datei verfügbar war, aber ich bekam Fehler in meiner Browserkonsole, als sie versuchte, sie zu registrieren.
Bei Firefox bekomme ich diesen Fehler:
Fehler bei der Registrierung des Servicemitarbeiters:
TypeError: ServiceWorker-Skript bei https://example.com/service-worker.js für Umfang https://example.com/ ist während der Installation auf einen Fehler gestoßen.
Auf Chrome erhalte ich den aussagekräftigeren Fehler:
Fehler bei der Service-Worker-Registrierung: DOMException: Fehler beim Registrieren eines ServiceWorker: Das Skript hat einen nicht unterstützten MIME-Typ (‘text/html’).
Sicher genug, wenn ich auf der Registerkarte Netzwerk meiner Entwicklertools nachschaue und nach dem suche service-worker.js Datei, kann ich sehen, dass sie den falschen MIME-Typ in den HTTP-Headern hat.
Ich konnte jedoch nicht verstehen, warum es den falschen MIME-Typ hat?
(in navigator.serviceWorker.register('/service-worker.js'))
Oder vielleicht brauchen Sie:
'%PUBLIC_URL%/serviceworker.js'
Vielen Dank an @DanielLord für seinen Kommentar.
DAS ist die richtige Antwort. Der MIME-Typfehler ist das Ergebnis einer nicht gefundenen Datei.
– Petrus
26. Juli 2020 um 8:28 Uhr
Meins hat es in “%PUBLIC_URL%/serviceworker.js” geändert. Aber Sie haben mir klar gemacht, dass der Pfad falsch war, nicht der MIME-Typ
– Daniel Lord
1. Februar um 22:41 Uhr
In meiner Express-Serveranwendung habe ich eine Wildcard-Route (Sternchen / *), auf die umgeleitet wird index.html:
// Load React App
// Serve HTML file for production
if (env.name === "production") {
app.get("*", function response(req, res) {
res.sendFile(path.join(__dirname, "public", "index.html"));
});
}
Dies ist ein sehr verbreitetes Designmuster. Dies bedeutet jedoch, dass alle Anfragen nach unbekannten Textdateien zunächst umgeleitet werden index.htmlund kehren daher mit dem MIME-Typ von zurück "text/html"auch wenn es sich tatsächlich um eine JavaScript- oder SVG-Datei oder eine andere Art von Klartextdatei handelt.
Die Lösung, die ich gefunden habe, bestand darin, eine bestimmte Route hinzuzufügen service-worker.jsVor die Wildcard-Route:
Nun, wenn der Browser sucht service-worker.jsgibt Express es mit dem korrekten MIME-Typ zurück.
(Beachten Sie, dass, wenn Sie versuchen, die service-worker.js Route nach dem Platzhalter, es funktioniert nicht, da die Platzhalterroute überschrieben wird.)
Bitte, was soll ich angeben, wenn meine index.html Datei befindet sich im Client/öffentlichen Ordner und nicht nur in einem öffentlichen Ordner? Ich versuche das res.sendFile(path.resolve(__dirname, "client", "public", "service-worker.js")); aber es wird zurückgegeben. Beim Abrufen des Skripts wurde ein ungültiger HTTP-Antwortcode (404) empfangen.
– Nevada-Stein
18. März 2021 um 0:58 Uhr
Ich denke, dass die Service-Worker-Datei nicht vorhanden ist http://localhost:3000/service-worker.js Der Server gibt stattdessen index.html zurück. Dann hat die Registrierungsfunktion keine Ahnung, was sie mit einer index.html-Datei anfangen soll und sagt Ihnen, dass der MIME-Typ nicht stimmt.
Eine schnelle Lösung wäre, die Datei service-worker.js in die zu kopieren public Ordner, damit, wenn Sie treffen http://localhost:3000/service-worker.js Sie sehen die Datei im Browser.
Denken Sie daran, zu ChromeDev > Anwendungen > ServiceWorkers zu gehen und auf Abbestellen zu klicken. um das fehlerhafte zu entfernen. Denken Sie daran, auch den Cache zu deaktivieren
Wenn Sie Ihre /public/service-worker.js nicht erreichen können. Dass es irgendwie immer index.html rendert, überprüfen Sie unbedingt Ihre vhost-Konfiguration, falls Sie eine haben. Meine Kollegen haben Regeln hinzugefügt, die es aufgrund von Umleitungsregeln unmöglich machten, die SW.js-Datei bereitzustellen.
– BiasInput
29. Januar 2021 um 15:51 Uhr
WapShivam
Von ServiceWorker unterstützte MIME-Typen sind „text/javascript“, application/javascript und application/x-javascript. Gehen Sie zu Ihrer Serverdatei und setzen Sie sie
Falls Sie an NodeJS arbeiten, sollte die serviceWorker-Datei im öffentlichen Ordner abgelegt werden. Wenn Sie Webpack verwenden, um serviceWorker öffentlich zu exportieren, müssen Sie „copy-webpack-plugin“ verwenden.