Developer Tools

WebAssembly (WASM) para desarrolladores web

Una introducción práctica a WebAssembly: qué es, cómo funciona y cómo usarlo para potenciar tus aplicaciones web con un rendimiento casi nativo.

10 min de lectura

Code on a screen

WebAssembly (abreviado WASM) es una de las tecnologías más emocionantes que han llegado a los navegadores en la última década. Permite ejecutar código escrito en lenguajes como C, C++, Rust y Go a velocidades casi nativas — directamente en una pestaña del navegador, sin necesidad de plugins.

Esta guía cubre todo lo que un desarrollador web necesita saber para empezar a trabajar con WebAssembly hoy mismo.

¿Qué es WebAssembly?

WebAssembly es un formato de instrucciones binarias para una máquina virtual basada en pila. Está diseñado como un objetivo de compilación portátil para lenguajes de alto nivel, permitiendo su despliegue en la web tanto para aplicaciones cliente como servidor.

Piensa en él como un lenguaje ensamblador de bajo nivel para el navegador — pero seguro, en sandbox y diseñado para ejecutarse junto a JavaScript, no para reemplazarlo.

Dato clave: WebAssembly es ahora un estándar W3C, compatible con todos los principales navegadores: Chrome, Firefox, Safari y Edge.

¿Por qué debería importarte?

JavaScript es increíblemente versátil, pero tiene límites — especialmente para tareas intensivas en CPU como:

  • Codificación y decodificación de video/audio
  • Procesamiento de imágenes y filtros
  • Simulaciones de física y renderizado 3D
  • Criptografía
  • Ejecución de bases de código C/C++ heredadas en el navegador

WebAssembly cubre estas carencias ejecutándose a velocidades mucho más cercanas al código máquina nativo.

Característica JavaScript WebAssembly
Velocidad de ejecución Interpretado / JIT Casi nativa
Sistema de tipos Dinámico Tipado fuerte
Soporte de lenguajes Solo JS C, C++, Rust, Go, etc.
Formato de archivo Texto (.js) Binario (.wasm)
Acceso al DOM Directo A través de puente JavaScript

Cómo funciona WebAssembly

El flujo de trabajo típico es el siguiente:

  1. Escribe tu código en un lenguaje compatible (p. ej., Rust o C++)
  2. Compílalo a un binario .wasm usando una cadena de herramientas (p. ej., wasm-pack, Emscripten)
  3. Carga el archivo .wasm en JavaScript usando la API WebAssembly
  4. Llama a las funciones WASM exportadas directamente desde tu código JavaScript
Source Code (Rust/C++) → Compiler → .wasm binary → Browser

Tu primer módulo WebAssembly

Veamos un ejemplo sencillo usando Rust y wasm-pack.

Paso 1: Instala la cadena de herramientas

# Install Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# Install wasm-pack
cargo install wasm-pack

Paso 2: Crea una librería en Rust

// src/lib.rs
use wasm_bindgen::prelude::*;

#[wasm_bindgen]
pub fn add(a: i32, b: i32) -> i32 {
    a + b
}

#[wasm_bindgen]
pub fn fibonacci(n: u32) -> u64 {
    match n {
        0 => 0,
        1 => 1,
        _ => {
            let mut a = 0u64;
            let mut b = 1u64;
            for _ in 2..=n {
                let c = a + b;
                a = b;
                b = c;
            }
            b
        }
    }
}

Paso 3: Compila a WASM

wasm-pack build --target web

Esto genera una carpeta pkg/ que contiene tu archivo .wasm y los bindings JavaScript generados automáticamente.

Paso 4: Úsalo en JavaScript

import init, { add, fibonacci } from './pkg/my_wasm_lib.js';

async function run() {
  await init(); // Load and instantiate the WASM module

  console.log(add(3, 5));         // → 8
  console.log(fibonacci(40));     // → 102334155 (fast!)
}

run();

Cargar WASM sin un bundler

Si no estás usando un bundler, puedes cargar un módulo WASM directamente con la API nativa WebAssembly del navegador:

async function loadWasm(url) {
  const response = await fetch(url);
  const buffer = await response.arrayBuffer();
  const { instance } = await WebAssembly.instantiate(buffer, {});
  return instance.exports;
}

const wasm = await loadWasm('/my-module.wasm');
console.log(wasm.add(10, 20)); // → 30

Casos de uso reales

WebAssembly ya impulsa aplicaciones impresionantes en el mundo real:

🎬 Procesamiento de video

Herramientas como FFmpeg han sido compiladas a WASM, permitiendo que los navegadores recorten, conviertan y codifiquen archivos de video completamente del lado del cliente — sin necesidad de subir nada a un servidor.

🖼️ Edición de imágenes

Photopea y Squoosh usan WASM para ejecutar códecs avanzados (como los codificadores AVIF y WebP) directamente en el navegador para una compresión de imágenes rápida y de alta calidad.

🎮 Videojuegos

Unity y Unreal Engine soportan la exportación de juegos a WebAssembly, permitiendo que juegos 3D completos se ejecuten en una pestaña del navegador.

🔒 Criptografía

Librerías como libsodium se compilan a WASM para que puedas realizar operaciones criptográficas rápidas y seguras (hashing, cifrado) completamente en el cliente.

🗄️ SQLite en el navegador

Proyectos como sql.js compilan SQLite a WASM, ofreciendo una base de datos relacional completa que se ejecuta localmente — sin necesidad de servidor.

WASM y JavaScript: mejor juntos

Un malentendido común es que WebAssembly está aquí para reemplazar a JavaScript. No es así. Son complementarios:

  • JavaScript gestiona la UI, la manipulación del DOM, los eventos y la lógica de conexión
  • WebAssembly se encarga del cómputo pesado que sería demasiado lento en JS

Llamas a las funciones WASM desde JavaScript igual que a cualquier otra función. El puente entre ambos es transparente.

Buenas prácticas:

  • Mantén tus módulos WASM enfocados en el cómputo — evita intentar manipular el DOM desde WASM
  • Minimiza la copia de datos entre la memoria de JS y WASM (tiene un coste)
  • Usa SharedArrayBuffer y Atomics para cargas de trabajo WASM con múltiples hilos
  • Cachea tus archivos .wasm de forma agresiva — son binarios y se comprimen muy bien

Depuración de WebAssembly

Las DevTools modernas de los navegadores tienen un soporte sólido para WASM:

  • Chrome DevTools puede recorrer instrucciones WASM e incluso mostrar mapas de fuente de vuelta a tu código Rust/C++ original
  • Usa console.log desde el lado de JS para inspeccionar los valores pasados hacia/desde WASM
  • La CLI de wasm-bindgen incluye un flag --debug que incrusta mapas de fuente
wasm-pack build --target web --debug

El futuro: WASM más allá del navegador

WebAssembly ya no es solo una tecnología de navegador. El estándar WASI (WebAssembly System Interface) extiende WASM para ejecutarse fuera del navegador — en servidores, funciones edge y dispositivos IoT — con un modelo de ejecución portátil y en sandbox.

Runtimes como Wasmtime, WasmEdge y WAMR te permiten ejecutar módulos WASM en cualquier lugar, convirtiéndolo en un fuerte candidato para el futuro del código del lado del servidor portátil y seguro.

Resumen

WebAssembly abre toda una nueva categoría de aplicaciones en la web. Esto es lo que debes recordar:

  • WASM se ejecuta a velocidad casi nativa en todos los principales navegadores
  • Escribe en Rust, C, C++ o Go — luego compila a .wasm
  • Usa wasm-pack (Rust) o Emscripten (C/C++) para empezar
  • WASM y JavaScript trabajan juntos — no son competidores
  • Los casos de uso reales incluyen procesamiento de video, edición de imágenes, videojuegos y bases de datos

¿Listo para experimentar? Prueba nuestro codificador/decodificador Base64 gratuito — es una de las muchas herramientas de este sitio que aprovechan técnicas de procesamiento rápido del lado del cliente similares a los flujos de trabajo con WASM.