Рішення html5rocks вбудовування коду веб-робочого в HTML є досить жахливим.
І крапка втеченого JavaScript-as-a-string не краща, не в останню чергу, тому що це ускладнює робочий потік (компілятор закриття не може працювати на рядках).
Особисто мені дуже подобаються методи toString, але @ dan-man ТОГО регекс!
Мій кращий підхід:
// 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-адреса повинна відповідати точно, навіть якщо необов'язковий параметр 'name' відповідає. Для SharedWorker вам знадобиться окремий файл JavaScript.
Оновлення 2015 року - надходить особливість ServiceWorker
Тепер існує ще більш потужний спосіб вирішення цієї проблеми. Знову ж, зберігайте робочий код як функцію (а не статичну рядок) та конвертуйте за допомогою .toString (), а потім вставляйте код у CacheStorage під статичною 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'}})
);
});
Можливі дві можливі падіння. Об'єктURL, як зазначено вище, або більш плавно, розмістіть справжній файл JavaScript за адресою /my_workers/worker1.js
Перевагами такого підходу є:
- SharedWorkers також можна підтримувати.
- Вкладки можуть ділитися однією кешованою копією за фіксованою адресою. Підхід блобу поширює випадкові об'єктиURL для кожної вкладки.