Solusi html5rocks menanamkan kode pekerja web dalam HTML cukup mengerikan.
Dan gumpalan JavaScript-as-a-string yang lolos tidak lebih baik, paling tidak karena mempersulit alur kerja (Compiler Closure tidak dapat beroperasi pada string).
Secara pribadi saya sangat suka metode toString, tapi @ dan-man regex ITU!
Pendekatan pilihan saya:
// 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 );
Dukungan adalah persimpangan dari tiga tabel ini:
Ini tidak akan berfungsi untuk SharedWorker , karena URL harus sama persis, bahkan jika parameter 'nama' opsional cocok. Untuk SharedWorker, Anda memerlukan file JavaScript terpisah.
Pembaruan 2015 - Singularitas ServiceWorker tiba
Sekarang ada cara yang lebih kuat untuk menyelesaikan masalah ini. Sekali lagi, simpan kode pekerja sebagai fungsi, (bukan string statis) dan konversikan menggunakan .toString (), lalu masukkan kode ke dalam CacheStorage di bawah URL statis pilihan Anda.
// 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'}})
);
});
Ada dua kemungkinan mundur. ObjectURL seperti di atas, atau lebih tepatnya, menempatkan a file JavaScript nyata di /my_workers/worker1.js
Keuntungan dari pendekatan ini adalah:
- SharedWorkers juga dapat didukung.
- Tab dapat membagikan satu salinan dalam tembolok pada alamat tetap. Pendekatan blob memperbanyak objekURUR acak untuk setiap tab.