এইচটিএমএলে ওয়েব কর্মী কোড এম্বেড করার html5rocks সমাধান মোটামুটি ভয়াবহ।
এবং পালিয়ে যাওয়া জাভাস্ক্রিপ্ট-এর-এ-স্ট্রিংয়ের একটি ব্লব আরও ভাল নয়, কমপক্ষে নয় কারণ এটি কাজের প্রবাহকে জটিল করে তোলে (বন্ধ সংকলক স্ট্রিংগুলিতে কাজ করতে পারে না)।
ব্যক্তিগতভাবে আমি টসস্ট্রিং পদ্ধতিগুলি পছন্দ করি তবে @ ড্যান-ম্যান TH
আমার পছন্দসই পদ্ধতি:
// 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 );
সমর্থন হ'ল এই তিনটি সারণীর ছেদ:
এটি অবশ্য ভাগ করা ওয়ার্কারের পক্ষে কাজ করবে না , কারণ mustচ্ছিক 'নাম' প্যারামিটারের সাথে মিল থাকলেও ইউআরএল অবশ্যই একটি সঠিক মিল হতে পারে। শেয়ার্ড ওয়ার্কারের জন্য আপনার আলাদা একটি জাভাস্ক্রিপ্ট ফাইল দরকার।
2015 আপডেট - সার্ভিস ওয়ার্কার এককত্বের আগমন
এখন এই সমস্যাটি সমাধানের আরও শক্তিশালী উপায় রয়েছে। আবার কর্মী কোডটি একটি ফাংশন হিসাবে সংরক্ষণ করুন (স্ট্যাটিক স্ট্রিংয়ের পরিবর্তে) এবং .toString () ব্যবহার করে রূপান্তর করুন, তারপরে কোডটি আপনার পছন্দের স্ট্যাটিক URL এর আওতায় ক্যাশেস্টোরেজে সন্নিবেশ করুন।
// 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 এ রাখুন
এই পদ্ধতির সুবিধা হ'ল:
- ভাগ করা ওয়ার্কার্সকেও সমর্থন করা যেতে পারে।
- ট্যাবগুলি একটি নির্দিষ্ট ঠিকানায় একটি একক ক্যাশেড অনুলিপি ভাগ করতে পারে। ব্লব অ্যাপ্রোচ প্রতিটি ট্যাবটির জন্য এলোমেলোভাবে অবজেক্ট URL গুলিকে প্রসারিত করে।