A solução html5rocks de incorporar o código de trabalho da Web em HTML é bastante horrível.
E um blob de JavaScript escapado como uma string não é melhor, principalmente porque complica o fluxo de trabalho (o compilador Closure não pode operar em strings).
Pessoalmente, eu realmente gosto dos métodos toString, mas @ dan-man ISSO regex!
Minha abordagem preferida:
// 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 );
Suporte é a interseção dessas três tabelas:
No entanto, isso não funcionará para um SharedWorker , porque o URL deve ser uma correspondência exata, mesmo se o parâmetro opcional 'name' corresponder. Para um SharedWorker, você precisará de um arquivo JavaScript separado.
Atualização de 2015 - chega a singularidade do ServiceWorker
Agora, há uma maneira ainda mais poderosa de resolver esse problema. Novamente, armazene o código do trabalhador como uma função (em vez de uma sequência estática) e converta usando .toString () e insira o código no CacheStorage em uma URL estática de sua escolha.
// 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'}})
);
});
Existem dois possíveis substitutos. ObjectURL como acima, ou mais perfeitamente, coloque um arquivo JavaScript real em /my_workers/worker1.js
As vantagens dessa abordagem são:
- SharedWorkers também podem ser suportados.
- As guias podem compartilhar uma única cópia em cache em um endereço fixo. A abordagem de blob prolifera objectURLs aleatórios para cada guia.