Node.js com WebAssembly
WebAssembly é uma linguagem de baixo nível de alto desempenho, semelhante a assembly, que pode ser compilada a partir de várias linguagens, incluindo C/C++, Rust e AssemblyScript. Atualmente, é suportada pelo Chrome, Firefox, Safari, Edge e Node.js!
A especificação WebAssembly detalha dois formatos de arquivo, um formato binário chamado Módulo WebAssembly com extensão .wasm
e uma representação de texto correspondente chamada Formato de Texto WebAssembly com extensão .wat
.
Conceitos-chave
- Módulo - Um binário WebAssembly compilado, ou seja, um arquivo
.wasm
. - Memória - Um
ArrayBuffer
redimensionável. - Tabela - Um array tipado redimensionável de referências não armazenadas na Memória.
- Instância - Uma instanciação de um Módulo com sua Memória, Tabela e variáveis.
Para usar WebAssembly, você precisa de um arquivo binário .wasm
e um conjunto de APIs para se comunicar com o WebAssembly. O Node.js fornece as APIs necessárias por meio do objeto global WebAssembly
.
console.log(WebAssembly)
/*
Object [WebAssembly] {
compile: [Function: compile],
validate: [Function: validate],
instantiate: [Function: instantiate]
}
*/
Gerando Módulos WebAssembly
Existem vários métodos disponíveis para gerar arquivos binários WebAssembly, incluindo:
- Escrever WebAssembly (
.wat
) manualmente e converter para formato binário usando ferramentas como wabt. - Usar emscripten com um aplicativo C/C++.
- Usar wasm-pack com um aplicativo Rust.
- Usar AssemblyScript se você preferir uma experiência semelhante ao TypeScript.
TIP
Algumas dessas ferramentas geram não apenas o arquivo binário, mas também o código "glue" JavaScript e os arquivos HTML correspondentes para execução no navegador.
Como usar
Depois de ter um módulo WebAssembly, você pode usar o objeto WebAssembly
do Node.js para instanciá-lo.
const fs = require('node:fs')
const wasmBuffer = fs.readFileSync('/path/to/add.wasm')
WebAssembly.instantiate(wasmBuffer).then(wasmModule => {
// Função exportada vive em instance.exports
const { add } = wasmModule.instance.exports
const sum = add(5, 6)
console.log(sum) // Saída: 11
})
Interagindo com o SO
Módulos WebAssembly não podem acessar diretamente a funcionalidade do SO por si só. Uma ferramenta de terceiros Wasmtime pode ser usada para acessar esta funcionalidade. Wasmtime
utiliza a API WASI para acessar a funcionalidade do SO.