Die html5rocks-Lösung zum Einbetten des Web-Worker-Codes in HTML ist ziemlich schrecklich.
Und ein Blob von maskiertem JavaScript als Zeichenfolge ist nicht besser, nicht zuletzt, weil es den Arbeitsablauf verkompliziert (der Closure-Compiler kann nicht mit Zeichenfolgen arbeiten).
Persönlich mag ich die toString-Methoden wirklich, aber @ dan-man DIESER 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 );
Unterstützung ist der Schnittpunkt dieser drei Tabellen:
Dies funktioniert jedoch nicht für einen SharedWorker , da die URL genau übereinstimmen 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 kommt an
Jetzt gibt es eine noch leistungsfähigere Möglichkeit, dieses Problem zu lösen. Speichern Sie den Worker-Code erneut als Funktion (anstelle einer statischen Zeichenfolge) und konvertieren Sie ihn mit .toString (). Fügen Sie dann den Code unter einer statischen URL Ihrer Wahl in CacheStorage 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ückschläge. ObjectURL wie oben oder nahtloser setzen eine echte JavaScript-Datei unter /my_workers/worker1.js ablegen
Vorteile dieses Ansatzes sind:
- SharedWorker können ebenfalls unterstützt werden.
- Registerkarten können eine einzelne zwischengespeicherte Kopie an einer festen Adresse freigeben. Der Blob-Ansatz vermehrt zufällige objectURLs für jede Registerkarte.