Perché convertire WASM in JS?
Un binario .wasm non può essere eseguito in una pagina da solo - i browser lo caricano tramite JavaScript. Gli utenti desiderano un file .js per poter importare il modulo, passare gli import e chiamare le sue funzioni esportate come normali funzioni. Le toolchain generano questo codice di collegamento in modo che raramente si debba toccare il codice di caricamento grezzo.
Come convertire WASM in JS
Output glue di Emscripten OPEN-SOURCE
Quando compili C/C++, esegui emcc app.c -o app.js ed Emscripten emetterà sia app.wasm che il caricatore app.js che lo istanzia. Aggiungi -s MODULARIZE=1 per un modulo importabile.
wasm-pack per Rust OPEN-SOURCE
Per Rust + wasm-bindgen, esegui wasm-pack build --target web; produce il file .wasm più un file di binding .js che riesporta ogni funzione. Importalo nella tua app con init().
Informazioni su questi formati
Un file .wasm contiene un modulo WebAssembly compilato: un bytecode binario portatile prodotto da linguaggi come C, C++ o Rust ed eseguito a velocità quasi nativa. La maggior parte dei file…
Apri dettagli .WASM →Un file JS è un file di codice sorgente JavaScript - testo semplice e leggibile che alimenta l'interattività delle pagine web e le app lato server tramite Node.js. È possibile aprirlo in…
Apri dettagli .JS →Qualità e a cosa prestare attenzione
- Il file
.jsnon contiene la logica del modulo - carica e fa solo da ponte per il file.wasm, che deve essere distribuito insieme ad esso. - I caricatori scritti a mano devono fornire l'esatto oggetto di importazione che il modulo si aspetta, altrimenti l'istanza genererà un LinkError.
- Il codice glue di Emscripten/wasm-bindgen è legato all'esatta build che ha prodotto il
.wasm; mescolare le versioni rompe i binding.
Domande frequenti
Posso trasformare WASM completamente in JavaScript leggibile?
Ho ancora bisogno del file .wasm dopo aver generato il .js?
.js recupera e istanzia il .wasm a runtime; entrambi devono essere distribuiti insieme.Quale target flag dovrebbe usare wasm-pack?
--target web per moduli ES nativi, --target bundler per webpack/Vite, --target nodejs per Node.