HTML में वेब वर्कर कोड को एम्बेड करने का html5rocks समाधान काफी भयानक है।
और बच गए जावास्क्रिप्ट-ए-ए-स्ट्रिंग का एक बूँद बेहतर नहीं है, कम से कम नहीं क्योंकि यह काम-प्रवाह को जटिल करता है (क्लोजर कंपाइलर तार पर काम नहीं कर सकता है)।
व्यक्तिगत रूप से मैं वास्तव में। तरीके की तरह है, लेकिन @ दान आदमी regex!
मेरा पसंदीदा तरीका:
// 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 );
समर्थन इन तीन तालिकाओं का प्रतिच्छेदन है:
हालाँकि, यह एक SharedWorker के लिए काम नहीं करेगा , क्योंकि URL एक सटीक मिलान होना चाहिए, भले ही वैकल्पिक 'नाम' पैरामीटर मेल खाता हो। SharedWorker के लिए, आपको एक अलग जावास्क्रिप्ट फ़ाइल की आवश्यकता होगी।
2015 अद्यतन - ServiceWorker विलक्षणता आती है
अब इस समस्या को हल करने का एक और अधिक शक्तिशाली तरीका है। फिर से, कार्यकर्ता कोड को एक फ़ंक्शन के रूप में संग्रहीत करें, (एक स्थिर स्ट्रिंग के बजाय) और .toString () का उपयोग करके परिवर्तित करें, फिर अपनी पसंद के स्थिर URL के तहत कोड को CacheStorage में डालें।
// 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'}})
);
});
दो संभावित पतन-पीठ हैं। उपरोक्तानुसार ऑब्जेक्ट, या अधिक मूल रूप से, /my_workers/worker1.js पर एक वास्तविक जावास्क्रिप्ट फ़ाइल डालें
इस दृष्टिकोण के लाभ हैं:
- SharedWorkers का भी समर्थन किया जा सकता है।
- टैब्स एक तय पते पर एक ही कैश्ड कॉपी साझा कर सकते हैं। बूँद दृष्टिकोण हर टैब के लिए यादृच्छिक objectURL का प्रसार करता है।