JürgenB: Frage zum Wiki-Artikel „Web_Worker“

problematische Seite

Hallo,

im Wikiartikel steht

Sie müssen den Code, der im Worker ausgeführt werden soll, deshalb in einer eigenen .js Datei bereitstellen.

Das stimmt so nicht. Der Code kann auch direkt im HTML im Script-Bereich stehen:

<script id="worker" type="javascript/worker">
 ...
</script>

<script>
  var workerscript = window.URL.createObjectURL(new Blob([document.getElementById("worker").textContent],{type:'application/javascript'}));

  worker = new Worker(workerscript); 
</script>

Siehe z.B. https://www.j-berkemeier.de/LogistischeAbbildung.html

Gruß
Jürgen

  1. problematische Seite

    Hallo JürgenB,

    du hast ja recht. Aber das ist der Stand, den ich vorgefunden habe. Die Verwendung eines Blob mit einer Object-URL habe ich bei meinen Recherchen auch gefunden. Aber das ist ein Hack und der sollte bestenfalls als Goodie hintenan hängen. Find ich.

    Ich habe trotzdem überlegt, das noch einzubauen. Es ist aber eine komplizierte Sache und für eine Einführungsseite vermutlich zu komplex. Und ich wollte noch ausprobieren, ob das auch mit einer Data URL funktioniert, das würde (a) die Komplexität reduzieren und (b) die Frage obsolet machen, ob und wann man die Object-URL releasen muss.

    Ich habe mir auch noch vorgenommen, eine Worker-Demo zu machen. Dafür wäre die Variante mit einer Object- oder Data-URL vielleicht gar nicht schlecht. Aber ich ein Frickl krieg ich das trotzdem nicht, es sei denn, ich verstecke den Script-Block mit dem Worker im HTML. Das muss ich mir noch anschauen.

    Ich bin aber froh, die erste Überarbeitungsrunde durchbekommen zu haben. Den alten Stand fand ich zu simpel geschrieben - Web Worker sind ein Thema für Fortgeschrittene, da kann man auch etwas formaler sein und auch etwas über den Kontext erklären, in dem das stattfindet. Eigentlich wollte ich ja nur var durch let/const ersetzen und onmessage durch addEventListener. Und dann uferte es mal wieder aus 🤣

    Object-URLs wären die nächste Ausuferung.

    Rolf

    --
    sumpsi - posui - obstruxi
    1. problematische Seite

      Hallo Rolf,

      ich denke, es reicht, zu erwähnen, dass Worker auch im Script-Block stehen können. Oder du machst ein einfaches nicht funktionierendes Beispiel ans Ende.

      Fürs Frickl könnte man das Workerscript evtl. auch in einen String legen. So mache ich das mit den Scripten für die Grafikkarte. Dürfen in Template-Strings nicht auch Zeilenumbrüche stehen? Dann kann man sie die \n sparen.

      Gruß
      Jürgen

      1. problematische Seite

        Hallo JürgenB,

        done. Bitte beachten - deine Beispielseite macht zwei wichtige Fehler.

        Data-URLs sind auch möglich, hab ich ausprobiert, sind aber nicht so sinnvoll. Man muss den Sourcecode für den Worker entweder mit encodeURIComponent verschlüsseln, das wird bei JavaScript ziemlich lang, oder man macht eine base64-codierte URL daraus und dann bricht man sich die Finger, wenn Umlaute im Source sind. Es geht, aber man muss

        • Mit einem TextEncoder ein UInt8Array erstellen, das den UTF8-Bytestrom enthält
        • Diesen mit String.fromCodePoint(...encodedArray) wieder zum String machen. Ja, ... vor dem encoded Array. Denn fromCodePoint will pro Byte einen eigenen Parameter haben, also ist ein spread-Operator nötig.
        • Und den dann mit btoa() codieren.

        Da ist die Object-URL deutlich handzahmer.

        Rolf

        --
        sumpsi - posui - obstruxi