Решение html5rocks по встраиванию кода веб-работника в HTML довольно ужасно.
И капля с пробелом JavaScript-как-строка не лучше, не в последнюю очередь потому, что она усложняет рабочий процесс (компилятор Closure может 'не работает со строками).
Лично мне действительно нравятся методы 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'}})
);
});
Естьдва возможных отступления.ObjectURL, как указано выше, или, что более удобно, поместите real файл JavaScript в /my_workers/worker1.js
Преимущества этого подхода:
- SharedWorkers также могутподдерживаться.
- Вкладки могут совместно использовать одну кэшированную копию по фиксированному адресу.Подход BLOB-объектов увеличивает число случайных объектных URL для каждой вкладки.