La solución html5rocks de incrustar el código del trabajador web en HTML es bastante horrible.
Y una gota de JavaScript escapado como cadena no es mejor, sobre todo porque complica el flujo de trabajo (el compilador de cierre no puede funcionar en cadenas).
Personalmente, me gustan mucho los métodos toString, pero @ dan-man ¡ ESA expresión regular!
Mi enfoque preferido:
// 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 );
El soporte es la intersección de estas tres tablas:
Sin embargo, esto no funcionará para un SharedWorker , porque la URL debe ser una coincidencia exacta, incluso si coincide el parámetro opcional 'nombre'. Para un SharedWorker, necesitará un archivo JavaScript separado.
Actualización 2015: llega la singularidad ServiceWorker
Ahora hay una forma aún más poderosa de resolver este problema. Nuevamente, almacene el código de trabajo como una función (en lugar de una cadena estática) y convierta usando .toString (), luego inserte el código en CacheStorage bajo una URL estática de su elección.
// 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'}})
);
});
Hay dos posibles retrocesos. ObjectURL como arriba, o más fácilmente, coloque un archivo JavaScript real en /my_workers/worker1.js
Las ventajas de este enfoque son:
- SharedWorkers también puede ser compatible.
- Las pestañas pueden compartir una sola copia en caché en una dirección fija. El enfoque de blob prolifera objectURL aleatorios para cada pestaña.