De Rust a WASM con wasm-pack y React
Compile código Rust a WebAssembly con wasm-pack y use los enlaces de JS generados en una aplicación React.
De Rust a WASM con wasm-pack y React es una lección gratuita de React Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de React Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de React Academy incluye 4 lecciones en total.
La cadena de herramientas de Rust para WASM
El flujo de trabajo estándar de Rust a WASM utiliza dos herramientas: wasm-pack coordina la compilación (compila Rust a WASM, ejecuta wasm-bindgen y genera el paquete npm), mientras que wasm-bindgen genera bindings de JavaScript que permiten llamar a las funciones de Rust como funciones normales de JavaScript con una gestión adecuada de los tipos.
Atributo wasm-bindgen
El atributo #[wasm_bindgen] marca funciones, estructuras y métodos de Rust para exportarlos a JavaScript. Sin él, la función se compila a WASM, pero no es accesible desde JavaScript. Cuando anota una función con #[wasm_bindgen], wasm-bindgen genera el código auxiliar de JavaScript que gestiona la conversión de los argumentos y los valores devueltos.
Una función sencilla de Rust
Una función de Rust mínima exportada: use wasm_bindgen::prelude::*; #[wasm_bindgen] pub fn add(a: u32, b: u32) -> u32 { a + b }. La función recibe dos enteros sin signo de 32 bits y devuelve uno. wasm-bindgen genera JavaScript que llama a esta función con argumentos numéricos y devuelve un resultado numérico.
Compilación con wasm-pack
Ejecute wasm-pack build --target web en el directorio del crate de Rust. Esto compila el código de Rust a WASM, ejecuta wasm-bindgen para generar los bindings de JavaScript y produce un directorio pkg/ que contiene el binario .wasm, un módulo auxiliar de JavaScript y definiciones de tipos de TypeScript.
Importación en React
Importe el módulo generado en su componente React: import init, { add } from '../pkg/my_lib'. La función init carga e instancia el binario WASM (llámela una vez en un useEffect). Después de la inicialización, llame directamente a las funciones exportadas: const result = add(2, 3).
Pasar datos complejos: js_sys y JsValue
Para datos complejos que van más allá de los números primitivos, wasm-bindgen proporciona js_sys::Array (Array de JavaScript), js_sys::Object (Object de JavaScript) y wasm_bindgen::JsValue (cualquier valor de JavaScript). Estos tipos permiten que las funciones de Rust acepten y devuelvan arrays y objetos de JavaScript, aunque con una sobrecarga de serialización mayor que la de los tipos primitivos.
Minimizar la sobrecarga de marshalling
El principio clave de rendimiento es mantener los datos en la memoria de WASM y realizar allí todos los cálculos. Pase los datos una sola vez, realice los cálculos y devuelva únicamente el resultado final. Evite los patrones que transfieren datos repetidamente a través de la frontera de WASM en cada paso. La sobrecarga de cada cruce de frontera es pequeña, pero se acumula en los bucles intensivos.
serde-wasm-bindgen para estructuras
El crate serde-wasm-bindgen permite serializar estructuras de Rust a objetos de JavaScript y viceversa mediante Serde. Anote la estructura con #[derive(Serialize, Deserialize)] y utilice serde_wasm_bindgen::to_value() y from_value(). Este es el enfoque estándar para pasar datos estructurados complejos.
Ejecutar WASM en un Web Worker
Los cálculos de WASM de larga duración bloquean el hilo en el que se ejecutan. Coloque WASM en un Web Worker para mantener libre el hilo principal de React. Cree un archivo Worker que inicialice el módulo WASM y gestione los mensajes. Envíe datos al worker mediante postMessage, reciba los resultados mediante el evento message y, después, actualice el estado de React con el resultado.
Tipos de TypeScript de wasm-pack
wasm-pack genera automáticamente archivos de declaración de TypeScript (.d.ts) para todas las funciones y tipos exportados. Esto proporciona a su proyecto React con TypeScript seguridad de tipos completa al llamar a funciones de Rust. Los tipos generados reflejan las firmas de las funciones de Rust — add(a: number, b: number): number —, por lo que el autocompletado del IDE funciona correctamente.
Consideraciones para producción
Los binarios de WASM suelen tener un tamaño de 100kb-2MB después de la optimización. Habilite wasm-opt en la compilación de wasm-pack estableciendo opt-level = "z" en el perfil de release de Cargo.toml para aplicar una optimización agresiva del tamaño. Sirva los archivos WASM con Content-Type: application/wasm y habilite HTTP/2 para que el navegador transmita el binario de forma eficiente.
Atributo wasm-bindgen
¿Cuál es el propósito del atributo #[wasm_bindgen] en el código de Rust?
Resumen de la lección
wasm-pack build --target web compila Rust a WASM y genera enlaces de JavaScript mediante wasm-bindgen. Anote las funciones exportadas con #[wasm_bindgen]. Importe init y las funciones exportadas en React, llame a init() en un useEffect y, después, llame a las funciones como si fueran funciones normales de JavaScript. Utilice serde-wasm-bindgen para serializar estructuras complejas. Ejecute WASM en Web Workers para realizar cálculos prolongados sin bloquear el hilo principal de React.
Preguntas frecuentes
¿La lección «De Rust a WASM con wasm-pack y React» es gratis?
Sí — el texto completo de «De Rust a WASM con wasm-pack y React» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de React Academy, actualiza a CoddyKit PRO. El curso de React Academy incluye 4 lecciones en total.
¿Qué aprenderé en «De Rust a WASM con wasm-pack y React»?
Compile código Rust a WebAssembly con wasm-pack y use los enlaces de JS generados en una aplicación React. Practicas React Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar React Academy?
No se requiere experiencia previa. React Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «De Rust a WASM con wasm-pack y React»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de React Academy?
Sí. Cada lección de React Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Qué es WebAssembly y qué papel desempeña React
- Carga de módulos WASM en React
- De Rust a WASM con wasm-pack y React
- Casos de uso de WASM: procesamiento de imágenes y cálculos