Die Lösung von html5rocks, den Webworker-Code in HTML einzubetten, ist ziemlich grausam.
Und ein Blob von escaped JavaScript-as-a-string ist nicht besser, nicht zuletzt, weil es kompliziert Work-Flow (Closure Compiler kann nicht auf Strings).
Ich persönlich mag die toString-Methoden sehr, aber @dan-man DIESE Regex!
Mein bevorzugter Ansatz:
// 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 );
Die Unterstützung ist die Schnittmenge dieser drei Tabellen:
Das funktioniert nicht bei einer SharedWorker da die URL eine exakte Übereinstimmung sein muss, auch wenn der optionale Parameter "Name" übereinstimmt. Für einen SharedWorker benötigen Sie eine separate JavaScript-Datei.
Update 2015 - Die ServiceWorker-Singularität ist da
Jetzt gibt es eine noch bessere Möglichkeit, dieses Problem zu lösen. Auch hier speichern Sie den Worker-Code als Funktion (statt als statische Zeichenkette) und konvertieren ihn mit .toString(). Dann fügen Sie den Code in CacheStorage unter einer statischen URL Ihrer Wahl ein.
// 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'}})
);
});
Es gibt zwei mögliche Rückzugsmöglichkeiten. ObjectURL wie oben, oder noch nahtloser, indem man eine real JavaScript-Datei unter /my_workers/worker1.js
Die Vorteile dieses Ansatzes sind:
- SharedWorkers können ebenfalls unterstützt werden.
- Registerkarten können sich eine einzige Kopie im Cache unter einer festen Adresse teilen. Beim Blob-Ansatz werden zufällige objectURLs für jede Registerkarte erzeugt.