Ich denke, dass wir dank der Template-Literale in ES6 jetzt eine weitere coole Option für diese Aufgabe haben. Damit können wir auf die zusätzliche Worker-Funktion (und ihren seltsamen Anwendungsbereich) verzichten und einfach den Code, der für den Worker bestimmt ist, als mehrzeiligen Text schreiben, ähnlich wie in dem Fall, in dem wir Text speichern, aber ohne tatsächlich ein Dokument oder DOM zu benötigen, um das zu tun. Beispiel:
const workerScript = `
self.addEventListener('message', function(e) {
var data = e.data;
console.log('worker recieved: ',data);
self.postMessage('worker added! :'+ addOne(data.value));
self.close();//kills the worker
}, false);
`;
Hier ist ein der Rest des Ansatzes im Wesentlichen .
Beachten Sie, dass wir alle zusätzlichen Funktionsabhängigkeiten in den Worker ziehen können, indem wir sie in einem Array sammeln und .toString auf jeden von ihnen anwenden, um sie ebenfalls in Strings zu reduzieren (sollte funktionieren, solange es sich um Funktionsdeklarationen handelt), und dies dann einfach dem Skriptstring voranstellen. Auf diese Weise müssen wir keine Skripte importieren, die wir möglicherweise bereits in den Bereich des Codes, den wir schreiben, gebündelt haben.
Der einzige wirkliche Nachteil dieser speziellen Version ist, dass Linters nicht in der Lage sind, den Code des Service Workers zu linsen (da es sich nur um eine Zeichenkette handelt), was ein Vorteil für den "separaten Worker-Funktionsansatz" ist.