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