Node.js avec WebAssembly
WebAssembly est un langage de type assembleur haute performance qui peut être compilé à partir de divers langages, notamment C/C++, Rust et AssemblyScript. Il est actuellement pris en charge par Chrome, Firefox, Safari, Edge et Node.js !
La spécification WebAssembly détaille deux formats de fichiers, un format binaire appelé module WebAssembly avec une extension .wasm
et une représentation textuelle correspondante appelée format texte WebAssembly avec une extension .wat
.
Concepts clés
- Module - Un binaire WebAssembly compilé, c'est-à-dire un fichier
.wasm
. - Mémoire - Un ArrayBuffer redimensionnable.
- Table - Un tableau typé redimensionnable de références non stockées dans la mémoire.
- Instance - Une instanciation d'un module avec sa mémoire, sa table et ses variables.
Pour utiliser WebAssembly, vous avez besoin d'un fichier binaire .wasm
et d'un ensemble d'API pour communiquer avec WebAssembly. Node.js fournit les API nécessaires via l'objet global WebAssembly
.
console.log(WebAssembly)
/*
Object [WebAssembly] {
compile: [Function: compile],
validate: [Function: validate],
instantiate: [Function: instantiate]
}
*/
Génération de modules WebAssembly
Il existe plusieurs méthodes disponibles pour générer des fichiers binaires WebAssembly, notamment :
- Écrire WebAssembly (
.wat
) à la main et convertir au format binaire à l'aide d'outils tels que wabt. - Utiliser emscripten avec une application C/C++
- Utiliser wasm-pack avec une application Rust
- Utiliser AssemblyScript si vous préférez une expérience de type TypeScript
TIP
Certains de ces outils génèrent non seulement le fichier binaire, mais aussi le code JavaScript "glue" et les fichiers HTML correspondants pour s'exécuter dans le navigateur.
Comment l'utiliser
Une fois que vous avez un module WebAssembly, vous pouvez utiliser l'objet WebAssembly
de Node.js pour l'instancier.
const fs = require('node:fs')
const wasmBuffer = fs.readFileSync('/path/to/add.wasm')
WebAssembly.instantiate(wasmBuffer).then(wasmModule => {
// La fonction exportée se trouve sous instance.exports
const { add } = wasmModule.instance.exports
const sum = add(5, 6)
console.log(sum) // Affiche : 11
})
Interagir avec le système d'exploitation
Les modules WebAssembly ne peuvent pas accéder directement aux fonctionnalités du système d'exploitation par eux-mêmes. Un outil tiers Wasmtime peut être utilisé pour accéder à cette fonctionnalité. Wasmtime
utilise l'API WASI pour accéder aux fonctionnalités du système d'exploitation.