Construyendo Mejores Sitios Web con Remix

Rate this content
Bookmark

Remix es un nuevo marco de trabajo web de los creadores de React Router que te ayuda a construir mejores y más rápidos sitios web a través de una sólida comprensión de los fundamentos de la web. Remix se encarga de las tareas pesadas como la renderización del servidor, la división de código, la precarga y la navegación, y te deja con la parte divertida: ¡construir algo increíble!

Michael Jackson
Michael Jackson
33 min
14 May, 2021

Video Summary and Transcription

Remix es un marco de trabajo web construido sobre React Router que se enfoca en los fundamentos de la web, la accesibilidad, el rendimiento y la flexibilidad. Ofrece beneficios reales de HTML y SEO, y permite la actualización automática de metaetiquetas y estilos. Proporciona características como funcionalidad de inicio de sesión, gestión de sesiones y manejo de errores. Remix es un marco de trabajo renderizado por el servidor que puede mejorar los sitios con JavaScript pero no lo requiere para la funcionalidad básica. Su objetivo es crear documentos de calidad impulsados por HTML y es flexible para su uso con diferentes tecnologías y pilas web.

Available in English

1. Introducción al marco web Remix

Short description:

¡Hola a todos! Hoy estoy emocionado de compartir Remix, un marco web construido sobre React Router. Remix proporciona una experiencia increíble para desarrollar sitios web con React, enfocándose en los fundamentos de la web, la accesibilidad, el rendimiento y la flexibilidad. Haremos una demostración rápida utilizando nuestra plantilla de inicio Express, que se puede implementar en varios proveedores de la nube. Remix es un modelo de programación único que funciona en cualquier lugar. Comenzaremos en los puntos de entrada, el punto de entrada del cliente para el renderizado en el navegador y el punto de entrada del servidor para el renderizado del servidor. Remix ofrece beneficios reales de HTML y SEO utilizando renderizar a cadena.

Hola a todos, ¿qué tal? Mi nombre es Michael Jackson. Estoy muy emocionado de estar aquí con ustedes hoy en la Cumbre de React. Muchas gracias por sintonizar mi charla. Estoy emocionado de compartir con ustedes lo que he estado trabajando hoy, específicamente, quiero hablar sobre Remix, que es un marco web que he estado construyendo durante el último año más o menos con mi socio comercial, Ryan Florence. Juntos, hemos estado trabajando en el Router de React durante los últimos cinco o seis años, que es un software de código abierto, es bastante grande, es utilizado por muchos personas alrededor del mundo para construir experiencias web increíbles. Remix está construido sobre el Router de React, las cosas increíbles que estamos construyendo para Remix en realidad van a regresar al Router de React. La idea detrás de Remix es que creemos que debería haber una experiencia increíble para desarrollar sitios web con el Router de React, con React, sitios web que están construidos sobre fundamentos web y que son simplemente increíbles para las personas, en términos de accesibilidad, en términos de rendimiento, y en términos de flexibilidad y potencia de las herramientas que tienes a tu disposición para construir cosas realmente geniales. Así que estoy realmente emocionado de compartir Remix con ustedes hoy. Y pensé en hacer una demostración rápida. Solo tengo 20 minutos, así que esto va a ser bastante rápido. Pero quería mostrarles cómo, saben, darles un pequeño recorrido por Remix y algunas de las cosas en las que hemos estado trabajando, y mostrarles cómo es construir una pequeña, saben, solo una pequeña aplicación con Remix. Así que en realidad voy a estar usando nuestra plantilla de inicio Express. Así que tenemos algunas de estas plantillas de inicio. Tenemos algunas, tenemos una ahora mismo para Express, que puedes implementar en cualquier servidor privado virtual antiguo que quieras o cualquier, sabes, muchos diferentes proveedores de nube simplemente ejecutarán aplicaciones Node. También tenemos una para Vercel. También tenemos una para arquitecto, que es, sabes, ejecutándose en AWS lambda. Tenemos soporte en camino para Netlify, para Firebase, y para los trabajadores de Cloudflare. Así que nuestro plan es con Remix simplemente soportar cualquier lugar donde quieras implementar una aplicación web, porque todos tienen sus diferentes, sabes, fortalezas y Remix es un único modelo de programación que puede funcionar en cualquiera de ellos. Así que voy a empezar con nuestro inicio Express. Tengo una pequeña aplicación aquí que en realidad, he estado trabajando en ella solo un poco. Es básicamente el inicio Express, pero he añadido algunos componentes. Tengo Tailwind funcionando aquí, tengo PostCSS funcionando, y ya tengo un par de rutas aquí. Así que vamos a empezar justo en la cima, justo en nuestros puntos de entrada. Así que tenemos dos puntos de entrada aquí en tu carpeta de aplicaciones. Este es el punto de entrada del cliente, así que este es un viejo hidrato de DOM de React normal, y el componente que estamos renderizando es nuestro componente de navegador Remix. Este es el que renderizas cuando llegas al navegador, y así tienes control total sobre tu punto de entrada si quisieras hacer algo globalmente en el navegador, puedes seguir adelante y hacerlo aquí en tu punto de entrada del cliente. En tu punto de entrada del servidor, esto normalmente se ejecuta en Node, pero esta es una función que es básicamente responsable de renderizar el HTML. Así que Remix es completamente aplicaciones de React renderizadas en el servidor, ¿verdad? Vas a obtener toda esa bondad de SEO, todo lo que te gusta, enviando HTML real por el cable, no estamos enviando solo una carcasa, y luego lo llenas más tarde. Este es HTML real. Así que estamos usando un renderizado estándar a cadena aquí

2. Devolviendo la página HTML y descripción general de la ruta

Short description:

Estamos devolviendo una página HTML utilizando la API de búsqueda web en Node. La ruta raíz en React Router sirve como el único punto de entrada, renderizando todo el documento. El componente outlet se utiliza para renderizar las rutas hijas. Cada ruta puede definir metaetiquetas para la página. El servidor de desarrollo está en funcionamiento, y vemos la página de bienvenida a Remix con un párrafo de hola mundo. Hoy haremos una demostración de autenticación.

para renderizar nuestro componente de servidor Remix. Y allí estamos devolviendo una página HTML. En esta función, obtienes una solicitud y devuelves una respuesta. Estos objetos no son cosas que inventamos. Estos son solo de la API de búsqueda web. Así que aunque esta función se ejecuta en Node, puedes usar las primitivas de búsqueda familiares que usas en la web. Así que esos son nuestros puntos de entrada para el cliente y el servidor. Vamos a echar un vistazo a nuestras rutas. Siempre tienes la ruta raíz. La ruta raíz es el único punto de entrada para React Router. Así que esta aplicación realmente llega a renderizar todo el documento. Vimos antes que estábamos en el documento. Así que aquí renderizamos el elemento html, el elemento head, el elemento body, estamos renderizando metaetiquetas y enlaces, echaremos un vistazo a esos en un segundo. Y luego tenemos un outlet aquí. Así que este es el elemento en React Router V6 que una ruta usa para renderizar sus rutas hijas. Así que el contenido de la página, al igual que la carne y el queso en un sándwich, simplemente va a ir allí en este componente outlet. Así que eso va estas rutas, ya sea la ruta 404 o la ruta índice. Así que vamos a echar un vistazo a nuestras rutas. Así que notarás en nuestra ruta índice, tenemos un componente aquí. Nosotros también tenemos esta función meta. Así que cada ruta tiene la oportunidad de definir estas son mis meta etiquetas que necesito. Ya sabes, información meta sobre la página. Así que en este caso, tenemos el título y la descripción para esta página. Así que vamos a asegurarnos de que nuestro servidor de desarrollo está en funcionamiento. Así que nuestro servidor de desarrollo ya está funcionando aquí. Así que vamos a encender eso en el navegador y ver lo que obtenemos. Vale, así que tenemos nuestra página de bienvenida a Remix. Esto es solo nuestro hola mundo. Básicamente, solo estamos renderizando esta pequeña etiqueta de párrafo. Vamos a modificar el título Remix. Vamos a hacer una demostración de autenticación hoy

3. Estilos y Componentes en Remix

Short description:

En Remix, podemos actualizar las metaetiquetas automáticamente a medida que las ajustamos. Importamos estilos utilizando una función de enlaces que genera elementos de enlace HTML. La ruta índice tiene metaetiquetas y enlaces específicos para ella. Al refrescar la página, podemos ver la carga del documento y la hoja de estilo global. Al agregar etiquetas de enlace a rutas específicas, podemos controlar qué estilos se cargan. Esto ayuda a evitar estilos en conflicto entre diferentes rutas. Vamos a agregar algunos componentes de buen aspecto, como una sección de héroe.

porque off es algo que todo el mundo tiene que hacer en la Web. Y así vamos a mostrar cómo lo haces en Remix. Así que a medida que ajustas tus metaetiquetas, actualizaremos automáticamente cosas como el título y demás para ti. Necesitamos poner algunos estilos aquí. Te dije antes que estábamos usando algo de post-CSS. Así que tenemos un observador de post-CSS funcionando, y está simplemente volcando algunos estilos en este directorio aquí. Así que lo que voy a hacer aquí es que voy a importar una URL para ese archivo desde ese directorio. Así que vamos a poner algunos estilos globales en la página. Y voy a tener algo aquí llamado una función de enlaces. Una función de enlaces se va a utilizar para generar esos elementos de enlace HTML, y vamos a ponerlos en la página para ti. Así que nuestra función de enlaces va a devolver un montón de enlaces que queremos en la página. En este caso queremos una hoja de estilo. Su URL es esa URL de estilos. Así que lo que Remix hace es que ahora sabe aquí está el componente que necesito renderizar, y aquí también hay algunos enlaces que necesito renderizar en la página, al igual que la ruta índice tiene algunas metaetiquetas que necesita renderizar. Así que vamos a refrescar esto aquí. Así que tenemos algunos estilos. Ahora vamos a echar un vistazo rápido a esta pestaña de red. Y podemos ver cuando refrescamos la página que estamos obteniendo el documento, también estamos obteniendo la hoja de estilo global que se está cargando aquí. Vamos a coger estos estilos, y vamos a poner una etiqueta de enlace en nuestra ruta índice que va a importar no los estilos globales, sino los estilos índice y eso debería ser bueno para esto. Vamos a volver a Chrome aquí. Echemos un vistazo. Así que ahora veremos que tanto los estilos globales como los estilos índice se cargan cuando estamos en la ruta índice, pero si por ejemplo estamos en la, ya sabes, ruta 404, notaremos que sólo estamos obteniendo los estilos globales. Te darás cuenta de que obtuvimos el correcto código de estado HTTP para esta página. Obtuvimos un 404 no encontrado. Eso es importante para cuando los motores de búsqueda vienen y golpean esta URL y ahora saben que es un verdadero 404 y no sólo un 200 que dice que no se encontró. También notarás que, así es como hacemos el CSS, ya sabes, cuando una ruta está activa, su CSS también está activo. Sus etiquetas de enlace están en la página, pero cuando esa ruta desaparece, sus etiquetas de enlace desaparecen de el HTML, así que esto te ayuda a evitar estilos en conflicto entre diferentes rutas. Todavía puedes tener tus estilos ser, ya sabes, usar regular CSS, simplemente añadiremos y quitaremos las etiquetas de enlace de la página cuando esas rutas se activan o no. Volvamos a nuestra ruta índice, y esto es un poco aburrido. Vamos a añadir algunos componentes de buen aspecto aquí. Vamos a conseguir nuestro, agarrar, tengo un par de componentes de Tailwind que voy a agarrar aquí y

4. Implementación del botón de inicio de sesión y la ruta de inicio de sesión

Short description:

En esta parte, implementamos el botón de inicio de sesión y creamos un nuevo archivo llamado signin.tsx para manejar la ruta de inicio de sesión. Añadimos un formulario de inicio de sesión a la página de inicio de sesión y creamos una función de acción para manejar el envío del formulario. El formulario actualmente no hace nada, pero tiene campos para la dirección de correo electrónico, la contraseña y una casilla de verificación de recordarme.

poner en la página, así que tengo una sección de héroe. También tengo una sección de contenido, y en lugar de decir bienvenido a Remix, vamos a poner el héroe allí, y pondremos la sección de contenido allí. Bueno, volvamos al navegador, refresquemos. Bueno, ahora tenemos un sitio web completo, eso está bastante bien, puedo irme a casa, he terminado por el día. Así que hoy lo que vamos a hacer es que vamos a implementar este botón de inicio de sesión. Notarás que ahora mismo sólo va a un 404 en la ruta de inicio de sesión, así que vamos a hacer que esa ruta sea una cosa real. Así que voy a crear un nuevo archivo aquí llamado signin.tsx y estamos imitando las URLs con el nombre del archivo. Así que si sólo tengo un archivo aquí llamado signin y exporta un componente, lo llamaremos signin. Y luego devolveremos un div llamado signin, algo así. Así que volveremos a nuestro navegador y refrescaremos. Así que notaremos que este componente en el signin.tsx se renderiza en slash signin. Así que es bastante cool. Vamos a agarrar un formulario de inicio de sesión. Formulario de inicio de sesión. Ahí vamos. En lugar de sólo ese div, vamos a devolver un formulario de inicio de sesión completo. Aquí en nuestra página de inicio de sesión, vamos a refrescar. Muy bien. Así que ahora tenemos un formulario de inicio de sesión en la ruta de inicio de sesión. Así que este formulario en realidad no hace nada todavía, realmente no podemos enviarlo. Pero notaremos que hay un par de campos aquí. Tenemos una dirección de correo electrónico, tenemos una contraseña y luego tenemos esta pequeña casilla de recordarme. Así que lo que vamos a hacer es que vamos a volver a nuestra ruta y vamos a añadir un manejador para el envío. Así que vamos a llamar a esto la función de acción. Y la función de acción va a obtener tu solicitud. Y esta va a ser en realidad una función asíncrona, porque lo que vamos a hacer es que vamos a leer los datos del formulario, básicamente, fuera del formulario. Espera request.text. Reconocerás esa API de la API de búsqueda web. Y el texto de la solicitud en realidad va a estar codificado en URL. Así que simplemente lo vamos a analizar usando los parámetros de búsqueda de URL, que es

5. Validación de Datos del Formulario e Inicio de Sesión

Short description:

Vamos a registrar los valores de los campos del formulario y redirigir después de la presentación. Validamos las credenciales comprobando si hay errores en los datos del formulario. Si falta el correo electrónico o la contraseña, establecemos un estado de error. De lo contrario, utilizamos el método Validar Credenciales para iniciar sesión en el usuario.

de nuevo otra API web. Es en realidad un nodo. Y vamos a console. Bueno, sé qué se llaman los campos del formulario. Así que hay un campo de correo electrónico, data.get el correo electrónico. También hay una contraseña. Contraseña. También va a haber una casilla de verificación de Recuérdame. Y voy a llamar a esa. Así que si se envía la casilla de verificación, su valor por defecto va a ser on. Así que vamos a registrar esos. Y luego vamos a redirigir de vuelta a la ruta de inicio de sesión cuando se envíe el formulario. Vale. Así que vamos a entrar en el navegador. Y oh, asegurémonos de tener nuestra console abierta para que podamos ver el envío a medida que llega. Así que voy a introducir mis credenciales aquí. Y voy a hacer clic en la casilla de verificación de recuerdo y diré enviar. Vale. Así que vemos en nuestro registro de console, vemos el correo electrónico. Oh, qué vergüenza. Puedes ver mi contraseña. Y la casilla de verificación de recuerdo fue marcada. Genial. Así que notaste que hubo un post y luego redirigimos de vuelta a la ruta de inicio de sesión. Así que luego hubo una posterior obtención en la ruta. Lo que vamos a hacer ahora es simplemente vamos a validar estas credenciales, ¿verdad? Si el correo electrónico y la contraseña eran válidos, entonces necesitamos iniciar sesión en el usuario. Si no lo eran, entonces vamos a redirigir a la página de inicio de sesión y tal vez mostrar un error o algo así. Así que lo que necesitamos hacer ahora es comprobar estas credenciales e iniciar sesión en el usuario si son válidas. Así que hagamos algo de validación aquí de los datos del formulario. Así que si no hay correo electrónico, eso es un estado de error. De lo contrario, si no hay contraseña, eso es igualmente otro estado de error. De lo contrario, digamos que el usuario es donde tenemos este método llamado Validar Credenciales al que podemos dar un correo electrónico y una contraseña

6. Uso de Sesiones y Redirecciones

Short description:

Para persistir la información de inicio de sesión a través de las solicitudes, utilizamos una sesión que aprovecha las cookies HTTP. Establecemos el ID del usuario y los redirigimos a la página de inicio si han iniciado sesión. Los encabezados personalizados, como el encabezado de configuración de cookies, se agregan utilizando la API de commit session. Podemos establecer una edad máxima en la cookie para persistirla durante una semana si se hace clic en la casilla de recuerdo. Al probar la funcionalidad de inicio de sesión, somos redirigidos de nuevo a la página de inicio, pero el enlace de inicio de sesión sigue siendo visible. Vamos a ver si podemos obtener el usuario en la página de inicio.

y eso debería darnos el usuario. Sin embargo, si el usuario es nulo, entonces eso es otro estado de error. Así que tenemos un montón de diferentes estados de error, pero este es el camino feliz. Esto significa que las credenciales eran válidas. ¿Entonces qué hacemos aquí? Bueno, vamos a utilizar una sesión para persistir la información de inicio de sesión a través de las solicitudes. Así que las sesiones aprovechan las cookies HTTP. Así que vamos a obtener la sesión y la vamos a obtener usando la sesión. Remix proporciona una API de almacenamiento de sesiones. Y vamos a obtenerla del encabezado de cookies que sale de la solicitud. Y así tenemos los objetos de sesión. Así que como dijimos, este es el camino feliz. Vamos a adelante y establecer el ID del usuario al user.id. Y vamos a redirigirlos de vuelta a la página de inicio si han iniciado sesión. Excepto en este caso, vamos a necesitar agregar algunos encabezados personalizados. En particular, el encabezado de configuración de cookies. Y vamos a utilizar la API de commit session para obtener el encabezado de configuración de cookies de vuelta. Así que las sesiones entran a través de las cookies. Y luego le decimos al navegador cuál es la nueva cookie con el encabezado de configuración de cookies. Así que de nuevo, esto es solo cosas fundamentales de la web. No estamos haciendo nada nuevo aquí. Así que no necesitamos esa console ya. O no necesitamos este registro de console ya. Otra cosa que quería recordar hacer es si hacen clic en la casilla de recuerdo, quiero establecer una edad máxima en esta cookie. Digamos que una semana, de lo contrario indefinido. Así que si hacen clic en la casilla de recuerdo, esta cookie persistirá durante una semana. De lo contrario, simplemente se cerrará cuando cierren esa pestaña. Así que vamos a probarlo. Así que vamos a ir aquí a nuestro formulario. Voy a introducir mi contraseña, la firmaremos, y funcionó. Parece que nos redirigieron de nuevo a la página de inicio, aunque no podemos decir realmente que estamos conectados porque todavía tenemos este enlace de inicio de sesión en la esquina aquí. Así que volvamos

7. Uso de la Función Loader y Acceso a los Datos de la Ruta

Short description:

Vamos a utilizar una función loader para recuperar datos para nuestra ruta. Si la sesión contiene un ID de usuario, obtendremos los datos del usuario. De lo contrario, el usuario es nulo. Podemos acceder a estos datos en nuestro componente utilizando los datos de la ruta. Después de refrescar la página, podemos ver el objeto de usuario que se pasa a nuestro componente. También tenemos un formulario.

a la página de inicio y veamos si podemos obtener el usuario aquí. Así que vamos a utilizar una función más aquí llamada función loader. La función loader es algo así como tu función de acción, excepto que esta es para lecturas, ¿verdad? La acción es para posts y puts y cosas así. Esta es para gets, puedes pensar en ella como tus props del lado del servidor si estás trabajando en Next.js. Así que vamos a utilizar los encabezados de la solicitud. Vamos a obtener esa sesión, vamos a obtener la cookie, y simplemente vamos a devolver algunos datos aquí que vamos a utilizar en nuestra ruta. Así que el usuario es, si la sesión tiene esa clave de ID de usuario podemos seguir adelante y obtener el usuario por ID. La sesión, obtendremos el ID de usuario de la sesión. De lo contrario, el usuario es nulo. Y la forma en que obtenemos estos datos aquí abajo en nuestro componente es que podemos utilizar los datos de la ruta. Así que te daremos un hook en react. Esta sección de héroe espera una prop de usuario. Así que simplemente vamos a guardar eso. Ahora tenemos una función loader que va a obtener nuestro objeto de usuario, pasarlo. Así que ya estamos registrados. Así que vamos a ir aquí a nuestra página y simplemente la refrescaremos. Y podemos ver ahora, tenemos el objeto de usuario que estamos pasando a nuestro, a nuestro componente aquí.

8. Implementando el Cierre de Sesión y el Manejo de Errores

Short description:

Echemos un vistazo al componente de la sección de héroe. Si tenemos un usuario, mostraremos un formulario para cerrar sesión. Añadiremos una ruta de cierre de sesión y una acción para destruir la sesión y redirigir a la página de inicio. El método de destruir sesión generará un encabezado de set cookie para destruir la sesión. En la ruta de inicio de sesión, manejaremos los estados de error y redirigiremos en función del éxito o del error. Utilizaremos la función loader en el siguiente get para recuperar datos.

Y estamos mostrando un mensaje diferente aquí. También tenemos un formulario. Echemos un vistazo a este componente rápidamente. El componente de la sección de héroe. Y puedes ver que aquí, si tenemos un usuario, vamos a mostrar un formulario para cerrar sesión, ¿verdad? Hola, nombre de usuario. Aquí está tu botón. Así que es solo un estándar, ya sabes, post a la ruta de cierre de sesión. Así que vamos a adelante y añadiremos una ruta de cierre de sesión aquí porque ahora mismo simplemente no tenemos una. Así que añade un cierre de sesión TSX. Y esta ruta en realidad no va a renderizar nada. Así que, el componente para esta ruta por ahora simplemente diremos que está vacío. Lo que realmente nos interesa es que queremos una acción en esta ruta. Y el trabajo de la acción es destruir la sesión y redirigirnos de vuelta a la página de inicio. Así que vamos a adelante y tomaremos esa sesión. Lo mismo que hemos hecho ahora varias veces. Y vamos a devolver la acción a esa sesión. Nuestra redirección de vuelta a la página de inicio, y esta vez los encabezados, el encabezado de set cookie, va a ser... Vamos a destruir esa sesión. ¿De acuerdo? Así que el método de destruir sesión, como el método de commit session, es responsable de generar un encabezado de set cookie. Pero en este caso, en lugar de persistir la sesión, esto en realidad va a destruirla. Así que vamos a volver aquí, haremos clic en nuestro botón de cierre de sesión. Vamos a golpear esa acción y vamos a ser redirigidos de vuelta a la página de inicio, excepto que esta vez no hay usuario, así que el usuario es nulo. Así que volvamos a nuestra ruta de inicio de sesión y llenemos algunos de estos estados de error. Al igual que podemos usar la sesión para persistir el ID de usuario, también podemos usar la sesión para persistir los errores. Así que digamos que si no nos dan una dirección de correo electrónico, pondremos un mensaje de flask, pondremos un error y diremos, por favor proporciona tu dirección de correo electrónico. Del mismo modo, si no nos dan una contraseña, diremos, por favor ingresa tu contraseña. De lo contrario, si nos dan unas malas credenciales, simplemente podemos decir algo como usuario inválido o correo electrónico y contraseña inválidos. Así que en caso de éxito, redirigimos de vuelta a la página de inicio, ¿verdad? Pero en caso de un error, simplemente vamos a redirigir de vuelta a la página de inicio de sesión. Así que vamos a adelante y persistiremos la cookie aquí. Así que estos mensajes flash pueden pasar. Y luego en el siguiente get, lo que podemos hacer es que podemos usar esa función loader que acabamos de ver en la ruta raíz o en la ruta índice. Consigamos nuestro loader aquí.

9. Recuperando la Sesión y Manejando los Errores

Short description:

En nuestro cargador, recuperamos la sesión y buscamos un mensaje de error. Si hay un error, obtenemos el error de la sesión y lo enviamos como datos JSON junto con los encabezados. Volvemos a confirmar la sesión para asegurar que los mensajes flash persistan a través de las solicitudes.

Y esta vez en nuestro cargador, lo que vamos a hacer es obtener la sesión. Y vamos a buscar un mensaje de error. Así que si había un mensaje de error, haremos una sesión.get el error. Y luego los data para esta ruta realmente van a ser algunos datos JSON data. Enviaremos ese mensaje de error. Y también enviaremos algunos encabezados. En este caso queremos confirmar una sesión de nuevo. Porque el caso con estos mensajes flash es que sólo persisten durante una solicitud. Así que si vas y haces un get en una clave que fue establecida con un flash, vas a necesitar ir adelante y confirmar esa sesión de nuevo. Porque el contenido de la sesión en realidad cambió.

10. Añadiendo el Manejo de Errores y la Renderización del Servidor

Short description:

Añadimos una propiedad de error a nuestro componente de formulario de inicio de sesión para mostrar un mensaje de error. Probando la funcionalidad de inicio de sesión, enviamos credenciales inválidas y mostramos el mensaje de error. Cabe destacar que nuestra aplicación está completamente renderizada en el servidor sin ningún JavaScript ejecutándose en el cliente. Al agregar JavaScript a la ruta raíz, podemos mejorar nuestro sitio, pero no es necesario para el flujo de inicio de sesión.

Bien, entonces lo sacaremos de aquí. Así que el error es usar la ruta data. Y vamos a añadir una propiedad de error a nuestro componente de formulario de inicio de sesión. Para que podamos ir adelante y podemos mostrar un error. Así que en nuestro componente de formulario de inicio de sesión, añadamos la propiedad de error. Va a ser una cadena opcional. Y digamos que si tenemos un error, lo pondremos aquí. Lo pondremos en un texto rojo. Lo centraremos. Lo pondré justo aquí.

OK, volvamos al navegador y probémoslo para ver si realmente funciona. Así que si intentamos iniciar sesión con algunas credenciales basura, deberíamos ver el mensaje de error aquí. Genial. Así que enviamos credenciales inválidas. Establecimos el error en la sesión. Lo enviamos de vuelta al navegador, el navegador envió la cookie de vuelta con la sesión, sacamos el mensaje de error, y dijimos, Oye, puedes mostrarlo en el componente del formulario de inicio de sesión. Y luego volvimos a renderizar la página para el formulario de inicio de sesión.

¿Quieres saber algo que es realmente genial? Mira la console del navegador aquí. No estamos usando ningún JavaScript en esta aplicación en absoluto. Esta es una aplicación completamente renderizada en el servidor. No hay ningún JavaScript ejecutándose en el cliente. Si quisiéramos que JavaScript se ejecutara en el cliente, todo lo que tendríamos que hacer es volver a nuestra ruta raíz. ¿Y ves este elemento de scripts aquí? Podríamos simplemente volcar esto en la página. Y vamos a refrescar. Así que ahora míralo, ahora tenemos React en la página, React router está en la página. Nuestro componente está hidratado. Realmente pasamos por el paso completo de hidratación allí. Pero no necesitábamos ninguno de ese JavaScript para code el flujo que ya hicimos, ese simple flujo de inicio de sesión. Esto es lo que queremos decir cuando hablamos de volver a los fundamentos de la web. JavaScript debería ser usado para mejorar tu sitio, para mejorar progresivamente tu sitio.

11. Introducción a Remix y Conclusión

Short description:

No necesitamos JavaScript para todo, como cargar kilobytes o megabytes de código solo para un formulario de inicio de sesión. Remix es un marco de trabajo emocionante del que nos encantaría hablar más. Regístrate en Remix.run y síguenos en Twitter en Remix_run. Soy MJackson en todas partes. ¡Gracias por ver la masterclass!

Para aquellos de ustedes que han estado aquí por un tiempo, saben, están familiarizados con ese término. No necesitamos JavaScript para hacer todo. No necesitamos cargar cientos de kilobytes de JavaScript o incluso megabytes de JavaScript solo para un simple formulario de inicio de sesión. Entonces, estos son los tipos de cosas que nos interesan.

Hay mucho más que me encantaría contarles sobre Remix, pero solo me dieron unos minutos en esta charla. Nos encantaría contarles más sobre ello en Remix.run. Todavía estamos en una vista previa para desarrolladores. Esperamos lanzar una beta más adelante este mes. Si estás interesado, puedes registrarte en Remix.run. O si estás interesado en seguir lo que estamos haciendo, síguenos en Twitter en Remix_run. Si estás interesado en seguirme personalmente, soy MJackson en Twitter y GitHub y en todas partes. Así que gracias de nuevo por ver la masterclass y esperamos verte por aquí.

QnA

Sesión de Preguntas y Respuestas con Michael

Short description:

Gracias, Michael. Realmente disfruté de tu charla y quedé impresionado por tus habilidades de codificación. Tengo algunas preguntas para ti, pero primero, veamos los resultados de la pregunta que hiciste. El 98% de la audiencia aún no ha usado Remix, pero están emocionados por ello. Ahora, demos la bienvenida a Michael al escenario. Ha tenido mucha práctica y prefiere codificar en su editor en lugar de usar diapositivas.

Muchas gracias, Michael. Quiero decir, todos ustedes que están escuchando en casa, vayan al chat de P&A y denle a Michael un gran aplauso por esa increíble charla. Realmente la disfruté. Además, quedé muy impresionado por la codificación que hizo. Me resulta muy difícil code cuando hay una cámara o alguien grabándolo. Definitivamente le voy a pedir algunos tips para mí mismo.

Pero tenemos muchas preguntas que nos llegan de ustedes. No dejen de enviar sus preguntas. Se las voy a pasar a Michael. Pero primero, veamos los resultados de la pregunta que Michael les hizo. Michael preguntó si usan o han usado alguna vez Remix y redoble de tambores. Los resultados son que el 98% de ustedes aún no lo han usado. Bueno, eso no es una sorpresa considerando que aún no es público. Pero tal vez podrán usarlo pronto. Estoy bastante seguro de que muchos de ustedes están emocionados por ello.

Pero estoy súper emocionado de invitar al escenario conmigo ahora a Michael, ¿cómo estás, Michael? Hola, me alegra estar aquí. Gracias por invitarme. Muchas gracias. Realmente aprecio la charla detallada que diste. Voy a verla de nuevo. No puedo esperar porque fue muy agradable verte construir rápidamente ese flujo. Gracias, hombre. He tenido mucha práctica. Hemos estado haciendo esto de la formación en React durante unos cinco o seis años. Y por mucho que me gustaría ser alguien que hace diapositivas bonitas y ordenadas, encuentro que estoy más cómodo simplemente hackeando algo de code en mi editor. Así que eso es siempre a lo que recurro cuando doy una presentación.

Beneficios y Casos de Uso del Marco Remix

Short description:

La idea principal detrás de Remix es permitir el uso de las tecnologías web o pilas favoritas. Es flexible y está construido sobre React Router, ofreciendo conceptos poderosos como el enrutamiento anidado. Remix se enfoca en los fundamentos web, apoyando el botón de retroceso y las mutaciones de datos a través de formularios HTML. El marco tiene un excelente servidor Discord para responder preguntas. Remix brilla en casos donde se evitan los conflictos de CSS, gracias a los nombres de clase únicos para las rutas activas. Su objetivo es crear documentos de calidad impulsados por HTML, similar al enfoque de PHP.

No, es impresionante. Ahora tenemos tantas preguntas, así que voy a entrar directamente. La primera pregunta que tenemos de Vasilis dice, ¿cuál dirías que es la mayor razón por la que deberían elegir usar Remix en lugar de Nuxt.js o Gatsby u otro framework que soporte el lado del servidor? Sí, entonces la idea principal detrás de Remix es que deberías poder usar tus tecnologías web favoritas o tu pila favorita. No es muy dogmático. Entonces, por ejemplo, ponemos Remix y lo tomamos y lo ejecutamos en AWS Lambda o tomamos Remix y lo ejecutamos en Cloudflare Workers o simplemente lo ejecutamos en una aplicación Express. Puedes usar Tailwind con él. Puedes usar CSS y JS con él. Así que es súper flexible. Y por supuesto, todo está construido sobre React Router, que si estás familiarizado con el concepto de enrutamiento anidado es en realidad un concepto muy poderoso que nos permite poner solo el code que necesitas en la página. Así que solo el JavaScript, solo los estilos, solo los data para esa ruta en particular o el conjunto de rutas activas están en la página a la vez. Así que es muy divertido y es, honestamente, más como arraigado en los fundamentos web, ¿verdad? Así que cosas como el soporte para el botón de retroceso, soporte para forms para mutaciones de data, cosas como esas, en lugar de cargar un montón de JavaScript para hacer tus mutaciones de data, simplemente usa un formulario HTML, cosas así. Así que nos hemos divertido mucho construyéndolo y con la retroalimentación que hemos recibido de la gente hasta ahora es que ellos también se están divirtiendo mucho. Así que tenemos un excelente servidor Discord en funcionamiento donde estamos todo el tiempo, respondiendo preguntas sobre él. Así que sí, definitivamente deberías venir a verlo si estás interesado en construir sitios impresionantes. Nos estamos divirtiendo mucho con esto. Genial. Sé que tenemos tantas preguntas, voy a volar a través de ellas. Pero me encanta lo que dijiste sobre la construcción en donde la gente puede usar las tecnologías web que ya aman y creo que eso es tan bueno para poder atender a todas esas personas. Una pregunta que realmente me gusta es, de George B, ¿tienes algunos ejemplos de casos de uso específicos donde remix realmente brilla? Um sí creo que realmente brilla en el caso en que tú... Bueno, como el caso de estilo por ejemplo, ¿verdad? CSS es por defecto global, ¿verdad? Tienes un espacio de nombres donde tienes que poner todos tus nombres de clase, todos tus IDs, etc. Y así que típicamente lo que sucede cuando la gente quiere desplegar su CSS o su estilo es que tienen que ir y sabes que tomarán sus nombres de clase CSS y los desfigurarán solo para asegurarse de que todos son únicos que no entran en conflicto con los nombres de clase CSS de otros componentes u otras cosas que pueden estar en la página y la verdad es que simplemente no saben lo que va a estar en la página así que desfigúralos todos y entonces no habrá conflictos. Uno de los casos donde este es un caso donde Remix realmente brilla y las rutas anidadas de las que te hablaba porque con React router en realidad tienes dos o tres rutas en la página y automáticamente añadiremos y quitaremos el CSS de y para la página solo para las rutas que están activas en la página. Así que podrías tener dos rutas hermanas que tienen nombres de clase idénticos pero eso está bien porque nunca van a estar en la página al mismo tiempo y así que por cierto no vamos a desfigurarlos simplemente no estarán allí así que no tendrás los conflictos. Así que ese es uno de los casos en los que creo que donde Remix realmente brilla es en evitar algunos de los aros por los que hemos estado saltando con CSS. Definitivamente hago todo lo posible para evitar aros. Nos estamos quedando sin tiempo y hay tantas preguntas entrando pero gente, aquellos de ustedes si no respondemos a su pregunta quiero que sepan que pueden unirse a Michael en su sala de discussion sobre Remix con Kent C Dodds y la sala de discussion estará en el discord así que vayan y encuentren ese canal y el enlace está en la línea de tiempo en el sitio web. Pero justo antes de irnos hagamos un fuego rápido de algunas más de estas preguntas solo tres rápidas. ¿Estamos volviendo a la era de PHP? ¿Sí o no? Oh absolutamente espero que sí. Así que la cosa es, sabes, PHP se usaba para generar HTML. HTML es lo que nos importa, ¿verdad? Ese es el lenguaje de la web ese es el lenguaje que los navegadores entienden. Sí, es agradable renderizar en el lado del cliente tus cosas y construimos React router que es un router framework renderizado en el lado del cliente así que sabes que absolutamente pensamos que puedes mejorar la web con cosas renderizadas en el lado del cliente pero el núcleo es HTML así que puedes pensar en Remix como un framework para crear documentos de calidad impulsados por HTML mucho como lo era PHP. Sí, HTML de calidad eso es a lo que siempre queremos llegar como desarrolladores. Muchas gracias, realmente aprecio que hayas venido hoy. Hey gracias Nathaniel, ha sido un placer. Nos vemos, adiós.

Check out more articles and videos

We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career

A Guide to React Rendering Behavior
React Advanced Conference 2022React Advanced Conference 2022
25 min
A Guide to React Rendering Behavior
Top Content
React is a library for "rendering" UI from components, but many users find themselves confused about how React rendering actually works. What do terms like "rendering", "reconciliation", "Fibers", and "committing" actually mean? When do renders happen? How does Context affect rendering, and how do libraries like Redux cause updates? In this talk, we'll clear up the confusion and provide a solid foundation for understanding when, why, and how React renders. We'll look at: - What "rendering" actually is - How React queues renders and the standard rendering behavior - How keys and component types are used in rendering - Techniques for optimizing render performance - How context usage affects rendering behavior| - How external libraries tie into React rendering
Don't Solve Problems, Eliminate Them
React Advanced Conference 2021React Advanced Conference 2021
39 min
Don't Solve Problems, Eliminate Them
Top Content
Humans are natural problem solvers and we're good enough at it that we've survived over the centuries and become the dominant species of the planet. Because we're so good at it, we sometimes become problem seekers too–looking for problems we can solve. Those who most successfully accomplish their goals are the problem eliminators. Let's talk about the distinction between solving and eliminating problems with examples from inside and outside the coding world.
Scaling Up with Remix and Micro Frontends
Remix Conf Europe 2022Remix Conf Europe 2022
23 min
Scaling Up with Remix and Micro Frontends
Top Content
Do you have a large product built by many teams? Are you struggling to release often? Did your frontend turn into a massive unmaintainable monolith? If, like me, you’ve answered yes to any of those questions, this talk is for you! I’ll show you exactly how you can build a micro frontend architecture with Remix to solve those challenges.
React Compiler - Understanding Idiomatic React (React Forget)
React Advanced Conference 2023React Advanced Conference 2023
33 min
React Compiler - Understanding Idiomatic React (React Forget)
Top Content
React provides a contract to developers- uphold certain rules, and React can efficiently and correctly update the UI. In this talk we'll explore these rules in depth, understanding the reasoning behind them and how they unlock new directions such as automatic memoization. 
Using useEffect Effectively
React Advanced Conference 2022React Advanced Conference 2022
30 min
Using useEffect Effectively
Top Content
Can useEffect affect your codebase negatively? From fetching data to fighting with imperative APIs, side effects are one of the biggest sources of frustration in web app development. And let’s be honest, putting everything in useEffect hooks doesn’t help much. In this talk, we'll demystify the useEffect hook and get a better understanding of when (and when not) to use it, as well as discover how declarative effects can make effect management more maintainable in even the most complex React apps.
Speeding Up Your React App With Less JavaScript
React Summit 2023React Summit 2023
32 min
Speeding Up Your React App With Less JavaScript
Top Content
Too much JavaScript is getting you down? New frameworks promising no JavaScript look interesting, but you have an existing React application to maintain. What if Qwik React is your answer for faster applications startup and better user experience? Qwik React allows you to easily turn your React application into a collection of islands, which can be SSRed and delayed hydrated, and in some instances, hydration skipped altogether. And all of this in an incremental way without a rewrite.

Workshops on related topic

React Performance Debugging Masterclass
React Summit 2023React Summit 2023
170 min
React Performance Debugging Masterclass
Top Content
Featured WorkshopFree
Ivan Akulov
Ivan Akulov
Ivan’s first attempts at performance debugging were chaotic. He would see a slow interaction, try a random optimization, see that it didn't help, and keep trying other optimizations until he found the right one (or gave up).
Back then, Ivan didn’t know how to use performance devtools well. He would do a recording in Chrome DevTools or React Profiler, poke around it, try clicking random things, and then close it in frustration a few minutes later. Now, Ivan knows exactly where and what to look for. And in this workshop, Ivan will teach you that too.
Here’s how this is going to work. We’ll take a slow app → debug it (using tools like Chrome DevTools, React Profiler, and why-did-you-render) → pinpoint the bottleneck → and then repeat, several times more. We won’t talk about the solutions (in 90% of the cases, it’s just the ol’ regular useMemo() or memo()). But we’ll talk about everything that comes before – and learn how to analyze any React performance problem, step by step.
(Note: This workshop is best suited for engineers who are already familiar with how useMemo() and memo() work – but want to get better at using the performance tools around React. Also, we’ll be covering interaction performance, not load speed, so you won’t hear a word about Lighthouse 🤐)
Concurrent Rendering Adventures in React 18
React Advanced Conference 2021React Advanced Conference 2021
132 min
Concurrent Rendering Adventures in React 18
Top Content
Featured WorkshopFree
Maurice de Beijer
Maurice de Beijer
With the release of React 18 we finally get the long awaited concurrent rendering. But how is that going to affect your application? What are the benefits of concurrent rendering in React? What do you need to do to switch to concurrent rendering when you upgrade to React 18? And what if you don’t want or can’t use concurrent rendering yet?

There are some behavior changes you need to be aware of! In this workshop we will cover all of those subjects and more.

Join me with your laptop in this interactive workshop. You will see how easy it is to switch to concurrent rendering in your React application. You will learn all about concurrent rendering, SuspenseList, the startTransition API and more.
React Hooks Tips Only the Pros Know
React Summit Remote Edition 2021React Summit Remote Edition 2021
177 min
React Hooks Tips Only the Pros Know
Top Content
Featured Workshop
Maurice de Beijer
Maurice de Beijer
The addition of the hooks API to React was quite a major change. Before hooks most components had to be class based. Now, with hooks, these are often much simpler functional components. Hooks can be really simple to use. Almost deceptively simple. Because there are still plenty of ways you can mess up with hooks. And it often turns out there are many ways where you can improve your components a better understanding of how each React hook can be used.You will learn all about the pros and cons of the various hooks. You will learn when to use useState() versus useReducer(). We will look at using useContext() efficiently. You will see when to use useLayoutEffect() and when useEffect() is better.
React, TypeScript, and TDD
React Advanced Conference 2021React Advanced Conference 2021
174 min
React, TypeScript, and TDD
Top Content
Featured WorkshopFree
Paul Everitt
Paul Everitt
ReactJS is wildly popular and thus wildly supported. TypeScript is increasingly popular, and thus increasingly supported.

The two together? Not as much. Given that they both change quickly, it's hard to find accurate learning materials.

React+TypeScript, with JetBrains IDEs? That three-part combination is the topic of this series. We'll show a little about a lot. Meaning, the key steps to getting productive, in the IDE, for React projects using TypeScript. Along the way we'll show test-driven development and emphasize tips-and-tricks in the IDE.
Web3 Workshop - Building Your First Dapp
React Advanced Conference 2021React Advanced Conference 2021
145 min
Web3 Workshop - Building Your First Dapp
Top Content
Featured WorkshopFree
Nader Dabit
Nader Dabit
In this workshop, you'll learn how to build your first full stack dapp on the Ethereum blockchain, reading and writing data to the network, and connecting a front end application to the contract you've deployed. By the end of the workshop, you'll understand how to set up a full stack development environment, run a local node, and interact with any smart contract using React, HardHat, and Ethers.js.
Designing Effective Tests With React Testing Library
React Summit 2023React Summit 2023
151 min
Designing Effective Tests With React Testing Library
Top Content
Featured Workshop
Josh Justice
Josh Justice
React Testing Library is a great framework for React component tests because there are a lot of questions it answers for you, so you don’t need to worry about those questions. But that doesn’t mean testing is easy. There are still a lot of questions you have to figure out for yourself: How many component tests should you write vs end-to-end tests or lower-level unit tests? How can you test a certain line of code that is tricky to test? And what in the world are you supposed to do about that persistent act() warning?
In this three-hour workshop we’ll introduce React Testing Library along with a mental model for how to think about designing your component tests. This mental model will help you see how to test each bit of logic, whether or not to mock dependencies, and will help improve the design of your components. You’ll walk away with the tools, techniques, and principles you need to implement low-cost, high-value component tests.
Table of contents- The different kinds of React application tests, and where component tests fit in- A mental model for thinking about the inputs and outputs of the components you test- Options for selecting DOM elements to verify and interact with them- The value of mocks and why they shouldn’t be avoided- The challenges with asynchrony in RTL tests and how to handle them
Prerequisites- Familiarity with building applications with React- Basic experience writing automated tests with Jest or another unit testing framework- You do not need any experience with React Testing Library- Machine setup: Node LTS, Yarn