Le technicien de service ne s'inscrit pas en raison de l'erreur ci-dessous
Registres des travailleurs de service
Publié en tant que problème github: https://github.com/facebook/create-react-app/issues/859
Le technicien de service donne l'erreur suivante lors de la tentative d'inscription:
Erreur lors de l'inscription du technicien de service:
DOMException: impossible d'enregistrer un ServiceWorker pour scope (' http: // localhost: 3000 / ') avec script (' http: // localhost: 3000/sw .js '):
Le script a un type MIME non pris en charge ('text/html'). console. @ index.js: 1
sw.js
s'affiche dans l'onglet sources des outils de développement Chrome, mais pas d'enregistrement.
Version React: 16.12.0
Message d'erreur:
Erreur lors de l'inscription du service worker: DOMException:
Impossible d'enregistrer un ServiceWorker pour scope (' http: // localhost: 3000 / ') avec script (' http: // localhost: 3000/sw.js '):
Le script a un type MIME non pris en charge ('text/html').
Échec de ServiceWorker dans l'onglet Inspect de Chrome:
Enregistrez un Service Worker dans React (passez de unregister à register, ou placez le code SW directement dans index.html, ou utilisez un SW plus simple. Tous provoquent la même erreur lors de l'exécution, en dev ou une application build react.)
Exemple SW:
export function register() {
if ("serviceWorker" in navigator) {
navigator.serviceWorker
.register("./sw.js")
.then(function(registration) {
// Successful registration
console.log(
"Hooray. Registration successful, scope is:",
registration.scope
);
})
.catch(function(error) {
// Failed registration, service worker won’t be installed
console.log(
"Whoops. Service worker registration failed, error:",
error
);
});
}
}
Bouge toi sw.js
dans le dossier public, donne cette erreur:
Existe-t-il un moyen de changer l'en-tête (de text/html
à application/javascript
) pour spécifiquement sw.js
lorsqu'il est servi au navigateur dans React?
J'ai essayé de suivre quelques articles de Medium sur l'enregistrement du service personnaliséWorkers dans React, en vain ...
Vous pouvez écrire du code côté serveur pour gérer le fichier sw.js. ci-dessous est le code nodejs qui intercepte la demande de fichier sw.js et lit le dossier et le renvoie au navigateur.
app.get('/sw.js', (req, res) => {
if (__DEVELOPMENT__) {
http.get('http://localhost:4001/static/build/sw.js', (r) => {
res.set({
'Content-Type': 'text/javascript',
'Cache-Control': 'max-age=0, no-cache, no-store, must-revalidate'
});
r.setEncoding('utf8');
r.pipe(res);
}).on('error', (e) => {
console.error(`Error in sending sw.js in dev mode : ${e.message}`);
});
} else {
res.setHeader('Cache-Control', 'max-age=0, no-cache, no-store, must-revalidate');
res.sendFile('sw.js', { root: path.join(__ROOT_DIRECTORY__, 'assets', 'build') }); // eslint-disable-line no-undef
}
});
Cela peut être un double de celui-ci 61776698
Principal pense que vous devez savoir: Créez le servieWorker dans le dossier public afin d'être traité comme un fichier .js et non un fichier texte/html.
Enregistrez ensuite ce service dans votre index.js
Étape 1, créez public/sw.js
self.addEventListener('message', async (event) => {
console.log('Got message in the service worker', event);
});
Étape 2, créez src/sw-register.js
export default function LocalServiceWorkerRegister() {
const swPath = `${process.env.PUBLIC_URL}/sw-build.js`;
if ('serviceWorker' in navigator && process.env.NODE_ENV !== 'production') {
window.addEventListener('load', function () {
navigator.serviceWorker.register(swPath).then(registration => {
console.log('Service worker registered');
});
});
}
}
Étape 3, dans src/index.js , ajoutez ces deux lignes
import LocalServiceWorkerRegister from './sw-register';
...
LocalServiceWorkerRegister();
Vous pouvez modifier certaines choses en fonction de vos besoins, mais avec ces modifications, vous devriez pouvoir travailler avec un technicien de service personnalisé dans une application create-react-app