Skip to content

Node.js con WebAssembly

WebAssembly es un lenguaje similar a un ensamblador de alto rendimiento que se puede compilar desde varios lenguajes, incluidos C/C++, Rust y AssemblyScript. ¡Actualmente, es compatible con Chrome, Firefox, Safari, Edge y Node.js!

La especificación de WebAssembly detalla dos formatos de archivo, un formato binario llamado Módulo WebAssembly con una extensión .wasm y una representación de texto correspondiente llamada formato de texto WebAssembly con una extensión .wat.

Conceptos Clave

  • Módulo - Un binario WebAssembly compilado, es decir, un archivo .wasm.
  • Memoria - Un ArrayBuffer redimensionable.
  • Tabla - Una matriz tipada redimensionable de referencias que no se almacenan en Memoria.
  • Instancia - Una instanciación de un Módulo con su Memoria, Tabla y variables.

Para usar WebAssembly, necesita un archivo binario .wasm y un conjunto de API para comunicarse con WebAssembly. Node.js proporciona las API necesarias a través del objeto global WebAssembly.

javascript
console.log(WebAssembly)
/*
Object [WebAssembly] {
  compile: [Function: compile],
  validate: [Function: validate],
  instantiate: [Function: instantiate]
}
*/

Generando Módulos WebAssembly

Hay varios métodos disponibles para generar archivos binarios WebAssembly, que incluyen:

  • Escribir WebAssembly (.wat) a mano y convertirlo a formato binario usando herramientas como wabt.
  • Usar emscripten con una aplicación C/C++.
  • Usar wasm-pack con una aplicación Rust.
  • Usar AssemblyScript si prefiere una experiencia similar a TypeScript.

TIP

Algunas de estas herramientas generan no solo el archivo binario, sino también el código "glue" de JavaScript y los archivos HTML correspondientes para ejecutar en el navegador.

Cómo usarlo

Una vez que tenga un módulo WebAssembly, puede usar el objeto WebAssembly de Node.js para instanciarlo.

javascript
const fs = require('node:fs')
const wasmBuffer = fs.readFileSync('/path/to/add.wasm')
WebAssembly.instantiate(wasmBuffer).then(wasmModule => {
  // La función exportada vive en instance.exports
  const { add } = wasmModule.instance.exports
  const sum = add(5, 6)
  console.log(sum) // Salida: 11
})

Interactuando con el SO

Los módulos WebAssembly no pueden acceder directamente a la funcionalidad del sistema operativo por sí mismos. Se puede utilizar una herramienta de terceros Wasmtime para acceder a esta funcionalidad. Wasmtime utiliza la API WASI para acceder a la funcionalidad del sistema operativo.

Recursos