Skip to content

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.

javascript
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.

javascript
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.

Ressources