La solution html5rocks consistant à incorporer le code du travailleur Web en HTML est assez horrible.
Et un blob de JavaScript échappé en tant que chaîne n'est pas mieux, notamment parce qu'il complique le flux de travail (le compilateur de fermeture ne peut pas fonctionner sur les chaînes).
Personnellement, j'aime vraiment les méthodes toString, mais @ dan-man QUE regex!
Mon approche préférée:
// Build a worker from an anonymous function body
var blobURL = URL.createObjectURL( new Blob([ '(',
function(){
//Long-running work here
}.toString(),
')()' ], { type: 'application/javascript' } ) ),
worker = new Worker( blobURL );
// Won't be needing this anymore
URL.revokeObjectURL( blobURL );
Le support est l'intersection de ces trois tables:
Cependant, cela ne fonctionnera pas pour un SharedWorker , car l'URL doit être une correspondance exacte, même si le paramètre facultatif «nom» correspond. Pour un SharedWorker, vous aurez besoin d'un fichier JavaScript distinct.
Mise à jour 2015 - La singularité ServiceWorker arrive
Il existe maintenant un moyen encore plus puissant de résoudre ce problème. Encore une fois, stockez le code de travail en tant que fonction (plutôt qu'une chaîne statique) et convertissez-le à l'aide de .toString (), puis insérez le code dans CacheStorage sous une URL statique de votre choix.
// Post code from window to ServiceWorker...
navigator.serviceWorker.controller.postMessage(
[ '/my_workers/worker1.js', '(' + workerFunction1.toString() + ')()' ]
);
// Insert via ServiceWorker.onmessage. Or directly once window.caches is exposed
caches.open( 'myCache' ).then( function( cache )
{
cache.put( '/my_workers/worker1.js',
new Response( workerScript, { headers: {'content-type':'application/javascript'}})
);
});
Il existe deux solutions de rechange possibles. ObjectURL comme ci-dessus, ou de manière plus transparente, placez un vrai fichier JavaScript dans /my_workers/worker1.js
Les avantages de cette approche sont:
- SharedWorkers peut également être pris en charge.
- Les onglets peuvent partager une seule copie en cache à une adresse fixe. L'approche blob prolifère des URL d'objet aléatoires pour chaque onglet.