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!
This talk has been presented at React Summit Remote Edition 2021, check out the latest edition of this React Conference.
FAQ
Remix puede ser implementado en diversas plataformas como servidores privados virtuales, AWS Lambda, Cloudflare Workers y más. Está diseñado para soportar múltiples proveedores de nube y adaptarse a sus fortalezas específicas.
Remix maneja de manera eficiente los estilos CSS y JavaScript al agregar o quitar automáticamente los estilos necesarios según las rutas activas en la página, evitando conflictos y optimizando la carga de recursos.
Remix ofrece un modelo de programación único que es compatible con cualquier lugar de implementación, y proporciona herramientas que facilitan el uso de tecnologías web estándar como HTML y formularios.
Remix está diseñado para mejorar la experiencia de usuario proporcionando sitios web rápidos, accesibles y fáciles de mantener, enfocándose en los fundamentos web y la mejora progresiva sin dependencia excesiva de JavaScript.
Remix es un marco web construido sobre React Router, diseñado para mejorar la experiencia de desarrollo de sitios web con React. Utiliza los fundamentos web para crear sitios accesibles, de alto rendimiento y flexibles.
Remix permite crear aplicaciones de React completamente renderizadas en el servidor, lo que mejora la SEO y la velocidad de carga al enviar directamente HTML real a los navegadores, sin necesidad de hidratación inicial del cliente.
En Remix, un 'loader' es una función utilizada para cargar datos en el servidor antes de que se renderice una página. Funciona similar a obtener props del lado del servidor en frameworks como Next.js, ideal para operaciones de lectura.
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.
¡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.
This transcription provides a brief guide to React rendering behavior. It explains the process of rendering, comparing new and old elements, and the importance of pure rendering without side effects. It also covers topics such as batching and double rendering, optimizing rendering and using context and Redux in React. Overall, it offers valuable insights for developers looking to understand and optimize React rendering.
Kent C. Dodds discusses the concept of problem elimination rather than just problem-solving. He introduces the idea of a problem tree and the importance of avoiding creating solutions prematurely. Kent uses examples like Tesla's electric engine and Remix framework to illustrate the benefits of problem elimination. He emphasizes the value of trade-offs and taking the easier path, as well as the need to constantly re-evaluate and change approaches to eliminate problems.
This talk discusses the usage of Microfrontends in Remix and introduces the Tiny Frontend library. Kazoo, a used car buying platform, follows a domain-driven design approach and encountered issues with granular slicing. Tiny Frontend aims to solve the slicing problem and promotes type safety and compatibility of shared dependencies. The speaker demonstrates how Tiny Frontend works with server-side rendering and how Remix can consume and update components without redeploying the app. The talk also explores the usage of micro frontends and the future support for Webpack Module Federation in Remix.
The Talk discusses React Forget, a compiler built at Meta that aims to optimize client-side React development. It explores the use of memoization to improve performance and the vision of Forget to automatically determine dependencies at build time. Forget is named with an F-word pun and has the potential to optimize server builds and enable dead code elimination. The team plans to make Forget open-source and is focused on ensuring its quality before release.
Today's Talk explores the use of the useEffect hook in React development, covering topics such as fetching data, handling race conditions and cleanup, and optimizing performance. It also discusses the correct use of useEffect in React 18, the distinction between Activity Effects and Action Effects, and the potential misuse of useEffect. The Talk highlights the benefits of using useQuery or SWR for data fetching, the problems with using useEffect for initializing global singletons, and the use of state machines for handling effects. The speaker also recommends exploring the beta React docs and using tools like the stately.ai editor for visualizing state machines.
Mishko, the creator of Angular and AngularJS, discusses the challenges of website performance and JavaScript hydration. He explains the differences between client-side and server-side rendering and introduces Quik as a solution for efficient component hydration. Mishko demonstrates examples of state management and intercommunication using Quik. He highlights the performance benefits of using Quik with React and emphasizes the importance of reducing JavaScript size for better performance. Finally, he mentions the use of QUIC in both MPA and SPA applications for improved startup performance.
Los primeros intentos de Ivan en la depuración de rendimiento fueron caóticos. Vería una interacción lenta, intentaría una optimización aleatoria, vería que no ayudaba, y seguiría intentando otras optimizaciones hasta que encontraba la correcta (o se rendía). En aquel entonces, Ivan no sabía cómo usar bien las herramientas de rendimiento. Haría una grabación en Chrome DevTools o React Profiler, la examinaría, intentaría hacer clic en cosas aleatorias, y luego la cerraría frustrado unos minutos después. Ahora, Ivan sabe exactamente dónde y qué buscar. Y en esta masterclass, Ivan te enseñará eso también. Así es como va a funcionar. Tomaremos una aplicación lenta → la depuraremos (usando herramientas como Chrome DevTools, React Profiler, y why-did-you-render) → identificaremos el cuello de botella → y luego repetiremos, varias veces más. No hablaremos de las soluciones (en el 90% de los casos, es simplemente el viejo y regular useMemo() o memo()). Pero hablaremos de todo lo que viene antes - y aprenderemos a analizar cualquier problema de rendimiento de React, paso a paso. (Nota: Esta masterclass es más adecuada para ingenieros que ya están familiarizados con cómo funcionan useMemo() y memo() - pero quieren mejorar en el uso de las herramientas de rendimiento alrededor de React. Además, estaremos cubriendo el rendimiento de la interacción, no la velocidad de carga, por lo que no escucharás una palabra sobre Lighthouse 🤐)
Con el lanzamiento de React 18 finalmente obtenemos el tan esperado renderizado concurrente. Pero, ¿cómo va a afectar eso a tu aplicación? ¿Cuáles son los beneficios del renderizado concurrente en React? ¿Qué necesitas hacer para cambiar al renderizado concurrente cuando actualices a React 18? ¿Y qué pasa si no quieres o no puedes usar el renderizado concurrente todavía?
¡Hay algunos cambios de comportamiento de los que debes estar al tanto! En esta masterclass cubriremos todos esos temas y más.
Acompáñame con tu portátil en esta masterclass interactiva. Verás lo fácil que es cambiar al renderizado concurrente en tu aplicación React. Aprenderás todo sobre el renderizado concurrente, SuspenseList, la API startTransition y más.
La adición de la API de hooks a React fue un cambio bastante importante. Antes de los hooks, la mayoría de los componentos tenían que ser basados en clases. Ahora, con los hooks, estos son a menudo componentes funcionales mucho más simples. Los hooks pueden ser realmente simples de usar. Casi engañosamente simples. Porque todavía hay muchas formas en las que puedes equivocarte con los hooks. Y a menudo resulta que hay muchas formas en las que puedes mejorar tus componentes con una mejor comprensión de cómo se puede usar cada hook de React.Aprenderás todo sobre los pros y los contras de los diversos hooks. Aprenderás cuándo usar useState() versus useReducer(). Veremos cómo usar useContext() de manera eficiente. Verás cuándo usar useLayoutEffect() y cuándo useEffect() es mejor.
ReactJS es extremadamente popular y, por lo tanto, ampliamente soportado. TypeScript está ganando popularidad y, por lo tanto, cada vez más soportado.
¿Los dos juntos? No tanto. Dado que ambos cambian rápidamente, es difícil encontrar materiales de aprendizaje precisos.
¿React+TypeScript, con los IDEs de JetBrains? Esa combinación de tres partes es el tema de esta serie. Mostraremos un poco sobre mucho. Es decir, los pasos clave para ser productivo, en el IDE, para proyectos de React utilizando TypeScript. En el camino, mostraremos el desarrollo guiado por pruebas y enfatizaremos consejos y trucos en el IDE.
En esta masterclass, aprenderás cómo construir tu primer dapp de pila completa en la blockchain de Ethereum, leyendo y escribiendo datos en la red, y conectando una aplicación de front end al contrato que has desplegado. Al final de la masterclass, entenderás cómo configurar un entorno de desarrollo de pila completa, ejecutar un nodo local e interactuar con cualquier contrato inteligente usando React, HardHat y Ethers.js.
La Biblioteca de Pruebas de React es un gran marco para las pruebas de componentes de React porque responde muchas preguntas por ti, por lo que no necesitas preocuparte por esas preguntas. Pero eso no significa que las pruebas sean fáciles. Todavía hay muchas preguntas que tienes que resolver por ti mismo: ¿Cuántas pruebas de componentes debes escribir vs pruebas de extremo a extremo o pruebas de unidad de nivel inferior? ¿Cómo puedes probar una cierta línea de código que es difícil de probar? ¿Y qué se supone que debes hacer con esa persistente advertencia de act()? En esta masterclass de tres horas, presentaremos la Biblioteca de Pruebas de React junto con un modelo mental de cómo pensar en el diseño de tus pruebas de componentes. Este modelo mental te ayudará a ver cómo probar cada bit de lógica, si debes o no simular dependencias, y ayudará a mejorar el diseño de tus componentes. Te irás con las herramientas, técnicas y principios que necesitas para implementar pruebas de componentes de bajo costo y alto valor. Tabla de contenidos- Los diferentes tipos de pruebas de aplicaciones de React, y dónde encajan las pruebas de componentes- Un modelo mental para pensar en las entradas y salidas de los componentes que pruebas- Opciones para seleccionar elementos DOM para verificar e interactuar con ellos- El valor de los mocks y por qué no deben evitarse- Los desafíos con la asincronía en las pruebas de RTL y cómo manejarlos Requisitos previos- Familiaridad con la construcción de aplicaciones con React- Experiencia básica escribiendo pruebas automatizadas con Jest u otro marco de pruebas unitarias- No necesitas ninguna experiencia con la Biblioteca de Pruebas de React- Configuración de la máquina: Node LTS, Yarn
Comments