Ich habe kürzlich begonnen, WebAssembly für einige meiner Projekte zu verwenden. Ich mache das, weil ich gehört habe, dass Wasm schneller ist als JavaScript.
Als ich mein erstes Wasm-Projekt startete, stellte ich fest, dass ich nicht wusste, wie ich das DOM in C ++ manipulieren sollte.
Gibt es eine Möglichkeit, dies mit Wasm zu tun?
webassembly
SherylHohman
quelle
quelle
Antworten:
WebAssembly ist schneller als JavaScript, jedoch nur für bestimmte Anwendungsfälle. Mit WebAssembly muss Ihr Browser weniger Arbeit leisten, um Ihren Code herunterzuladen und zu kompilieren, was die Startzeiten verkürzt. Wenn die Laufzeitleistung von WebAssembly jedoch normalerweise nur zwei- bis dreimal schneller ist als die von JavaScript. Im folgenden Artikel finden Sie einen sehr guten und praktischen Vergleich:
https://hacks.mozilla.org/2018/01/oxidizing-source-maps-with-rust-and-webassembly/
WebAssembly hat jedoch keinen direkten DOM-Zugriff. Trotz seiner überlegenen Leistung stellen Sie möglicherweise fest, dass es aufgrund des zusätzlichen E / A-Overheads für Ihren Anwendungsfall langsamer als JavaScript ist.
Aus diesem Grund sind WebAssembly derzeit am erfolgreichsten für algorithmische / rechenintensive Aufgaben.
Um das DOM zu manipulieren, müssen Sie dies über den JavaScript-Host tun. Ihr WebAssembly-Modul muss Nachrichten an JavaScript senden und es bitten, das DOM in seinem Namen zu manipulieren.
Da dies eine weit verbreitete Herausforderung ist, gibt es verschiedene Community-Projekte, die Lösungen für das Problem bieten. Wenn Sie C ++ verwenden, könnte dieses für Sie von Interesse sein:
https://github.com/mbasso/asm-dom
In Zukunft wird dies einfacher. Vorschläge wie Schnittstellentypen erleichtern die Interaktion mit der Hostumgebung und können den direkten Aufruf von Web-APIs über WebAssembly ermöglichen.
quelle
Leider kann auf das DOM nur im Haupt-JavaScript-Thread des Browsers zugegriffen werden. Service Worker-, Web Worker- und Web Assembly-Module hätten keinen DOM-Zugriff. Die nächste Manipulation, die Sie von WASM erhalten, besteht darin, Statusobjekte, die an den Hauptthread übergeben und von diesem gerendert werden, mit zustandsbasierten UI-Komponenten wie Preact / React zu bearbeiten .
Die JSON-Serialisierung wird am häufigsten verwendet, um den Status mit
postMessage()
oder Broadcast-Kanälen zu übergeben . Bitpacking- oder Binärobjekte können mitTransferrable
ArrayBuffers für leistungsfähigere Nachrichten verwendet werden, die den Aufwand für die JSON-Serialisierung / Deserialisierung vermeiden.quelle