Volver a la página principal
domingo 4 agosto 2024
31

Rust para la Web

Introducción al Desarrollo Web con Rust para Desarrolladores de NodeJS

Primeros pasos para un desarrollador de NodeJS en la programación web con Rust

Puedes encontrar el segundo artículo de esta serie ("despliega tu primera aplicación en Rust") aquí.

Rust es diferente. Puedes aprender Python o Ruby en un fin de semana, crear tu primera aplicación CRUD y estar satisfecho con los resultados.

Con Rust... con Rust tendrás dificultades para pasar una cadena (String) a otro método, cambiarla y devolverla. Entonces pedirás el libro de Rust, verás su tamaño, suspirarás y comenzarás.

Después de algunas semanas de luchar con el libro después del trabajo, te rendirás y esperarás a que alguien más cree un tutorial fácil de seguir.

Aquí tienes tu tutorial "fácil"

Luché con los mismos problemas. Sin embargo, las circunstancias de la vida me dieron unos meses para concentrarme realmente en Rust.

Lo que sigue es una primera visión general, conceptos y caminos a seguir. En las próximas semanas y meses, publicaré una serie de artículos para ayudarte a pasar del concepto al producto.

NodeJS vs Rust

Después de instalarlos (elegí brew para macOS en este ejemplo, el método no importa), la pila subyacente se ve diferente. NodeJS necesita V8, el motor de ejecución de Google, y enlaces a la biblioteca de JavaScript para ejecutar código JavaScript.

Rust depende casi completamente de sí mismo. Solo el compilador utiliza bibliotecas llvm, que están escritas en C y C++.

¿Cuánto "web" hay en Rust?

Fue y es una decisión de diseño no incluir una biblioteca http estándar en Rust. Por lo tanto, la capa OSI se cubre de manera diferente:

Node cubre toda la pila y ofrece, con Koa y Express, dos frameworks web bien conocidos y "sólidos como una roca" que te ayudan a construir aplicaciones sobre HTTP.

En el lado de Rust, solo TCP está implementado en el núcleo de Rust. Los frameworks web actuales (actix y rocket) implementan todo hasta HTTP. Así que no necesitas preocuparte de dónde viene esto.

Si deseas usar llamadas HTTP puras sin ningún framework más grande, puedes instalar "crates" (equivalente a paquetes npm en el mundo Node) que implementan el protocolo HTTP (como hyper y tiny_http).

npm vs cargo

Node usa npm para su gestión de paquetes:

  • npm install instala dependencias
  • npm run xyz ejecuta scripts dentro del package.json

En el lado de Rust, cargo maneja todo lo relacionado con tu proyecto:

  • cargo new NAME --bin crea una aplicación
  • cargo new NAME --lib crea una biblioteca
  • cargo run ejecuta el código
  • cargo build crea un ejecutable
  • cargo test ejecuta todas las pruebas dentro del proyecto

Hay una PR abierta para agregar cargo add para instalar dependencias. Actualmente, debes agregarlas a mano en tu archivo Cargo.toml. Como ves, no necesitas incluir scripts en un package.json para ejecutar pruebas o construir y probar tu aplicación.

Cambio de mentalidad: Cargo obtiene los paquetes después de cargo run, y solo si la versión cambió. Así que la primera vez obtendrá todos los paquetes, la segunda vez solo cuando ocurra un cambio en el número de versión. A diferencia de npm i, que obtiene los paquetes de inmediato y los agrega al package.json con la notación save.

Ecosistema

Node no es exitoso sin razón. El ecosistema es rico y floreciente. Rust todavía está en desarrollo, pero ya tiene muchos "crates" geniales. El sitio web arewewebyet.org está siguiendo el progreso y mostrándote paquetes interesantes en el mundo de Rust.

También hay un intento de crear un Framework Web oficial de Rust, llamado Tide. Ya está bastante maduro y puede usarse para proyectos secundarios. Siéntete libre de contribuir y ayudar a crear un gran entorno para el desarrollo web en Rust.

Programación Asíncrona también conocida como Promesas también conocida como Futures

La característica destacada de Node son las Promesas. Aunque no siempre son fáciles de entender y manejar, las Promesas y el bucle de eventos son lo que hace a Node tan atractivo.

Rust también está implementando un mecanismo asíncrono, que aún no está en la versión final. Se llaman Futures. Una biblioteca llamada Tokio ya ofrece un tiempo de ejecución asíncrono. Puedes seguir el progreso de la programación asíncrona en Rust en areweasyncyet.

¿Cómo empezar?

  • Instala Rust: curl https://sh.rustup.rs -sSf | sh
  • Crea un nuevo proyecto: cargo new web-app --bin
  • cd web-app

Ahora puedes elegir tu framework web favorito. Puedes empezar con rocket o actix. Puedes seguir los tutoriales en el sitio web para tener tu primera aplicación web en funcionamiento.

Advertencia: undefined, borrowing y types

Para no frustrarte hasta mi próximo post, aquí están las cuatro cosas principales sobre Rust a las que tendrás que acostumbrarte (que son bastante geniales después de un tiempo).

  • No hay undefined. Rust no tiene un valor null real. Esto es una característica. Rust tiene un tipo llamado Option, que encapsula el valor devuelto o None. En este caso, usamos el tipo Result para devolver un valor. Podrías, en lugar de devolver una cadena, devolver una opción que podría tener un valor de cadena o None si el sitio web del que estamos obteniendo no contiene ningún texto. Una solución fácil, que no deberías usar en producción, es .unwrap() los resultados para obtener la cadena fuera de la encapsulación. Tarea: Intenta comprobar si la solicitud GET falló y devuelve un error en este caso en lugar de Ok().
  • Debes haber oído hablar de borrowing. En resumen: cada asignación (=) a un tipo no trivial (todo lo que no tiene un tamaño fijo) mueve la propiedad. El método fetch_text() no está tomando la propiedad sobre la url, sino que solo está usando una referencia a ella (a través de & ). Tarea: Descubre por qué este código falla aquí y cómo solucionarlo.
  • Siempre debes saber qué tipo devuelve un método. En este ejemplo, nuestra biblioteca HTTP reqwest está devolviendo una estructura de respuesta (tipo) que implementa ciertos métodos. La documentación es, como con muchos crates, excelente. Así que echa un vistazo aquí.
  • No tienes que escribir return para devolver un valor de un método. Simplemente no pongas un ; al final de una declaración y esto se convierte en tu valor de retorno.

Usa este ejemplo para experimentar, ver dónde puedes obtener errores y aprender a solucionarlos.

Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer