Usamos express para ejecutar ambos procesos, ambas aplicaciones en un solo proceso. Enviamos todo desde /_next/whatever a Next, para que pueda manejar APIs y enviar activos. Usamos express static para la compilación pública, la carpeta pública y la compilación pública de
Remix. Enviamos una solicitud específica a
Remix y el resto de las solicitudes a Next inicialmente. Esto significa que al principio tuvimos que manejar los errores de Next, pero eventualmente cambiamos y comenzamos a enviar todas las solicitudes a
Remix de forma predeterminada y solo las solicitudes específicas a
NextJS. Hicimos esto cuando movimos toda nuestra caché, todas las rutas, como el perfil de usuario, a
Remix, y eso nos permitió hacer el cambio y decir, ok, a partir de ahora todo va a
Remix excepto esta ruta, como la ruta de API de Next o algunas rutas que aún estábamos sirviendo con
HTML para Next. También tuvimos que compartir el estado de autenticación porque el cambio de una aplicación a otra para el usuario debería haber sido el mismo. El usuario no sabía si la ruta estaba usando
Remix o Next, excepto probablemente porque era más rápido. Así que creamos un mixout. Cambiamos el SDK de
Next.js a RemixOut con la estrategia Out0 y luego nos dimos cuenta de que el objeto de almacenamiento de sesión de
Remix en realidad no está vinculado de ninguna manera a
Remix. Podemos usarlo en Next. Puedes instalar esa parte en la aplicación de Next y hacer que funcione. Así puedes ver cómo puedes pasar el valor de res.headers.cookie a sessionStore.getSession y obtener la sesión, y luego confirmar la sesión y obtener la cadena para enviar a res.setHeader. Y de la misma manera podemos hacerlo con
Remix. Así que compartimos este sessionStore para poder compartir el estado de autenticación entre aplicaciones.
Finalmente, otro problema que tuvimos fue que los enlaces de
Remix apuntaban a aplicaciones de Next mientras intentábamos hacer una navegación del lado del cliente, y eso fallaba porque la ruta aún no existía en
Remix. Y lo mismo sucedía en sentido contrario. Los enlaces de Next que apuntaban a
Remix intentaban hacer lo mismo, intentando cargar la siguiente ruta a la que el usuario estaba navegando usando Next, pero eso ya no existía. La solución fue, mientras la migración aún estaba en curso, agregamos reload document en los componentes de
Remix y evitamos usar el componente de enlace de Next. Así que cada enlace era una navegación de página completa. Lo mismo con los formularios. Cada formulario causaba una navegación de página completa incluso si el enlace o el formulario apuntaban a una ruta que ya sabíamos que estaba usando
Remix. Así que establecimos la línea de base, básicamente todo usaba navegación de página completa, y una vez que la migración estuvo lista y sabíamos que no había más código de
Next.js en ejecución en producción, eliminamos todos los documentos de recarga y todos se convirtieron en una aplicación de una sola página.
Ahora cómo usamos
Remix en Daffin. Primero,
Remix es un
backend para
frontend para nosotros. El usuario interactúa solo con
Remix, no hay forma de que el usuario vea una solicitud a la API de Rails, simplemente la envía a
Remix y desde allí a Rails, y usamos esto para agregar datos de múltiples puntos finales de nuestra API. En el lado del servidor, en los cargadores, simplemente podemos obtener múltiples puntos finales. Obtenemos los datos y también los filtramos en el lado del servidor, y podemos transformar los datos. Por ejemplo, convertimos objetos de fecha en mensajes localizados o números en la cantidad de cadena localizada. Y debido a esto, porque la mayoría de estas cosas que solíamos hacer en la interfaz de usuario ahora están en los cargadores, nuestros componentes de
React son más simples porque se centran solo en la interfaz de usuario, se centran en obtener los datos de useLoaderData y mostrarlos al usuario, y algunos estados o esfuerzos específicos para la integración principalmente con servicios de terceros.
Comments