Node.js avec WebAssembly
WebAssembly est un langage de type assembleur hautes performances qui peut être compilé à partir de divers langages, notamment C/C++, Rust et AssemblyScript. Actuellement, il est supporté 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 en mémoire.
- Instance - Une instantiation 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
Plusieurs méthodes sont disponibles pour générer des fichiers binaires WebAssembly, notamment :
- Écrire du 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 « colle » et les fichiers HTML correspondants pour 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 => {
// Les fonctions exportées se trouvent sous instance.exports
const { add } = wasmModule.instance.exports
const sum = add(5, 6)
console.log(sum) // Affiche : 11
})
Interaction 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 à ces fonctionnalités. Wasmtime
utilise l'API WASI pour accéder aux fonctionnalités du système d'exploitation.