HTML'de web çalışanı kodunu gömmenin html5rocks çözümü oldukça korkunç.
Ve dize olarak kaçan JavaScript bloğu daha iyi değildir, en azından iş akışını karmaşıklaştırdığı için değil (Kapatma derleyicisi dizelerde çalışamaz).
Şahsen ben toString yöntemlerini seviyorum, ama @ dan-man BU regex!
Tercih ettiğim yaklaşım:
// 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 );
Destek, bu üç tablonun kesişimidir:
Ancak bu, SharedWorker için işe yaramaz , çünkü isteğe bağlı 'name' parametresi eşleşse bile URL'nin tam eşleşme olması gerekir. SharedWorker için ayrı bir JavaScript dosyasına ihtiyacınız olacaktır.
2015 güncellemesi - ServiceWorker tekilliği geldi
Şimdi bu sorunu çözmenin daha güçlü bir yolu var. Yine, çalışan kodunu bir işlev olarak (statik bir dize yerine) depolayın ve .toString () kullanarak dönüştürün, ardından kodu, seçtiğiniz statik bir URL altında CacheStorage'a ekleyin.
// 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'}})
);
});
İki olası geri dönüş vardır. Yukarıdaki gibi ObjectURL veya daha sorunsuz bir şekilde /my_workers/worker1.js dosyasına gerçek bir JavaScript dosyası koyun
Bu yaklaşımın avantajları:
- Paylaşılan Çalışanlar da desteklenebilir.
- Sekmeler, önbelleğe alınmış tek bir kopyayı sabit bir adreste paylaşabilir. Blob yaklaşımı, her sekme için rastgele objectURL'leri çoğaltır.