Я отвечу на свой вопрос, вы можете включить веб-работника в отдельный тег script
. Я полагаю, что тип сценария не является официальным, поэтому код в этом теге не будет оцениваться до позднего времени. Это будет выглядеть примерно так:
<script id="myWorkerCode" type="javascript/worker">
self.onmessage = function(e) {
const data = e.data
self.postMessage('received some data in worker thread');
};
</script>
затем в сценарии, где вам нужен работник, создайте BLOB-объект и присвойте контенту тип "javascript". сделайте этот BLOB-объект URL-адресом, который можно вставить в конструктор Worker
:
if(window.Worker) {
// select the id of the script that contains your worker code
const blob = new Blob([
document.querySelector('#myWebWorker').textContent
], {type: "text/javascript"})
// Note: window.webkitURL.createObjectURL() in Chrome 10+.
const worker = new Worker(window.URL.createObjectURL(blob));
worker.onMessage = (e) => {
console.log('received data in main thread')
};
}
Это больше "in-a-line-over", чем "inline", но позволяет веб-работникам составляться и использоваться в одном файле. Хитрость заключается в использовании тегов сценария и преобразовании неоцененного javascript путем назначения тегов сценария для указанных типов в приведенном выше коде. Все еще не самое элегантное решение, но очень удобное при переносе процессов в другой поток.