Remixando tu Stack en un Espacio de Trabajo Monorepo

This ad is not shown to multipass and full ticket holders
React Summit US
React Summit US 2025
November 18 - 21, 2025
New York, US & Online
The biggest React conference in the US
Learn More
In partnership with Focus Reactive
Upcoming event
React Summit US 2025
React Summit US 2025
November 18 - 21, 2025. New York, US & Online
Learn more
Bookmark
Rate this content

Remix entró en escena con una visión única y refrescante sobre cómo desarrollar en la web. Pero, ¿cómo lo integras en tu ecosistema existente de aplicaciones? ¿Quieres probar Remix en un proyecto pequeño o quieres ir a fondo, pero es complicado hacer una migración completa desde tu aplicación React existente? En esta charla, vamos a explorar cómo una organización de código basada en monorepo puede ayudar a integrar Remix con tu infraestructura existente de React y TypeScript, facilitando la reutilización de código y un camino de migración hacia Remix.

This talk has been presented at Remix Conf Europe 2022, check out the latest edition of this React Conference.

FAQ

Un Monorepo es un concepto en el desarrollo de software donde múltiples proyectos se almacenan en un único repositorio de código. Esto facilita el compartir código y la colaboración entre diferentes equipos, permitiendo una mejor integración y gestión de dependencias entre los proyectos.

En un Monorepo, se puede estructurar separando las aplicaciones y paquetes en carpetas distintas. Por ejemplo, las características y funciones pueden ser independientes y estar encapsuladas en carpetas de paquetes, mientras que la aplicación principal, como una hecha en Next.js, mantiene su propio mecanismo de enrutamiento.

La migración incremental permite a los desarrolladores hacer transiciones suaves de una tecnología a otra, en este caso de Next.js a Remix, ajustando y probando las características gradualmente sin interrumpir el sistema actual. Esto es especialmente útil para aplicaciones en producción que necesitan estabilidad y tiempo para adaptarse.

Las dependencias se manejan a nivel de raíz del Monorepo y se comparten entre los paquetes y aplicaciones. Esto permite una fácil gestión y actualización de las mismas, además de usar herramientas como Nx para asegurar que las dependencias se compilen en el orden correcto y se cacheen para optimizar los tiempos de construcción.

Nx ofrece funciones como la ejecución de scripts en un orden específico, almacenamiento en caché de compilaciones, y configuración automatizada que facilita la gestión del Monorepo. Nx también ayuda a escalar eficientemente la estructura del proyecto a medida que crece, optimizando los flujos de trabajo de desarrollo y producción.

Juri Strumpflohner
Juri Strumpflohner
22 min
18 Nov, 2022

Comments

Sign in or register to post your comment.
Video Summary and Transcription
Hablemos sobre remixar nuestro stack en un espacio de trabajo monorepo, que permite una migración incremental y es adecuado para la transición desde una aplicación Next.js a un stack de remix. Es posible que se requiera refactorizar componentes específicos de características acopladas a Next.js, pero el proceso se simplifica porque las características ya se han movido. Es necesario configurar el monorepo para hacer referencia a los paquetes localmente y vincularlos a la aplicación Next.js. Nx proporciona beneficios como una actualización rápida, configuraciones predefinidas y características como el almacenamiento en caché local y remoto.

1. Remixing Stack in Monorepo Workspace

Short description:

Hablemos de mezclar nuestra pila en un espacio de trabajo de Monorepo. Sus archivos de enrutamiento deben configurar el enrutamiento para su pila específica, mientras que la implementación de la función debe estar en otro lugar. Puede organizar su código teniendo una carpeta de enrutamiento y una carpeta de funciones dentro de su aplicación. Alternativamente, puede mover las funciones a una carpeta de paquetes dedicada, lo que resulta en una estructura limpia y encapsulada. Esta configuración permite una migración incremental y es adecuada para la transición de una aplicación Next.js a una pila de remix.

Cómo Remix Tu Pila con ReactJS

Hola, hablemos de cómo podemos remix nuestra pila en un espacio de trabajo de Monorepo. Y me gustaría comenzar con una cita, o en realidad un tweet de Ryan Florens de hace un par de semanas, donde hizo una declaración bastante poderosa y menciona que sus archivos de enrutamiento deben configurar el enrutamiento para su pila específica. La implementación real de esa función que se visualiza allí, debe estar en otro lugar, ¿verdad? Entonces, lo importas, pero luego, dependiendo específicamente de la pila que tengas, configuras el enrutamiento y lo importas, y luego se agrupa y se visualiza en la página web.

Y este es un mecanismo muy poderoso para diseñar su sistema, pero también para organizar su código. Y podemos llevar esto aún más lejos. Normalmente, vemos exactamente este tipo de estructura, lo que Ryan Florence mencionó. Entonces tienes tu aplicación, tienes la carpeta de enrutamiento, que puede ser páginas, rutas, app, lo que sea. Y luego deberías tener, como menciona Ryan, una carpeta diferente potencialmente dentro de esa aplicación, que son tus funciones. Y luego tienes diferentes carpetas para todas esas funciones. Y el enrutamiento simplemente las importa.

Ahora podríamos ir un paso más allá e incluso moverlas fuera de la aplicación a una carpeta de paquetes dedicada. Entonces, esta nueva estructura, lo que ves ahora es que tenemos una carpeta de aplicaciones y ahora tenemos una carpeta de paquetes. Y en la carpeta de aplicaciones, todavía tenemos nuestra aplicación con su mecanismo de enrutamiento. Y luego, en la carpeta de paquetes, ahora tenemos diferentes carpetas para todas nuestras funciones. Y todas estas funciones ahora están independientes y encapsuladas de manera ordenada, y tienen un punto de API muy limpio donde hay un archivo index.ts que expone todo lo que se puede usar externamente y todo lo demás permanece dentro de ese paquete. Entonces, puedes imaginar que obtenemos una estructura muy limpia teniendo esta configuración aquí. Obviamente, podemos seguir adelante e importar como antes. Nuestra importación incluso podría parecer como si la consumiéramos de algún paquete externo como algún registro de MPM. Pero en realidad, solo se consume localmente en este caso. Pero puedes verlo aquí desde una declaración de importación.

Entonces, ¿cómo ayuda esto, en realidad? Bueno, potencialmente con algo como una migración incremental. Ahora, es posible que hayas notado que en mi ejemplo, usé una aplicación Next.js, ¿verdad? Está esa carpeta de páginas. Bueno, si usas las nuevas funciones o te unes a las nuevas funciones, es posible que tengas una carpeta de enrutamiento diferente allí. Pero esto no fue por accidente, sino que fue intencional. Entonces, es posible que hoy en día tengas una aplicación Next.js con algunas funciones ya incorporadas, con una aplicación que ya se ha desarrollado durante unos meses o incluso años. Y es posible que desees pasar lentamente a una pila de remix porque por alguna razón, eso es más adecuado para ti. Entonces, esto es exactamente lo que podrías lograr en esta configuración, porque como puedes ver, nuestra aplicación Next.js real y la función real ya están separadas y ordenadas. Y si prestas atención, esto ya es un Monorepo. Si quieres, ¿verdad? Solo tenemos una sola aplicación allí, pero tenemos una aplicación.

2. Adding Applications and Refactoring Features

Short description:

Podemos agregar otra aplicación al monorepo y generar una nueva aplicación de remix. Esto nos permite migrar nuevas características o mantener ambas aplicaciones dependiendo del caso de uso. Es posible que se requiera refactorización para componentes específicos de características y acoplados a Next.js. El proceso se simplifica porque las características ya se han movido. Juergen Stromflohner, un experto en tecnologías web, demuestra cómo funciona esto utilizando Annex, un sistema de compilación extensible. La aplicación Next con la carpeta de características está organizada y la refactorización implica crear carpetas, mover la aplicación y hacer que las características sean autónomas con su propio paquete.

Tenemos un par de paquetes. Por lo tanto, esto es totalmente un monorepo, uno muy simple. Entonces, lo que podríamos hacer es simplemente agregar otra aplicación en ese caso. Por ejemplo, agregar una nueva aplicación de remix, que es nuestro destino de migración objetivo. Correcto. Donde queremos mover nuevas características o incluso mantenerlas dependiendo del caso de uso o estrategia de implementación.

Podríamos generar una nueva aplicación de remix con el comando create remix y luego agregar esa aplicación dentro de nuestro espacio de trabajo de monorepo e importar las características que ya tenemos. Puede haber algunas cosas específicas de características o incluso cosas que están acopladas a la aplicación Next.js, obviamente. Esas necesitan o podrían necesitar alguna refactorización. Pero es mucho más fácil porque ya se han movido.

Entonces, ¿cómo funciona esto en la práctica? Permítanme mostrarles. Pero primero, mi nombre es Juergen Stromflohner. Soy un experto desarrollador en tecnologías web. También soy instructor de ACAD. Y trabajo como director de experiencia de desarrollador para una herramienta llamada Annex. Annex es un sistema de compilación inteligente, rápido y extensible que funciona muy bien para configuraciones de monorepo y estructuras de aplicaciones que acabamos de discutir. Así que echemos un vistazo.

Tengo aquí mi aplicación Next con esa carpeta de características, que se importa directamente desde nuestra configuración de enrutamiento. Y esas características están organizadas de manera muy ordenada. Hay un archivo index.js que exporta nuestra funcionalidad, que es muy simple. Y luego también tenemos el sistema de diseño que exporta aquí un solo botón. Pero esto está organizado de la misma manera. ¿Cómo refactorizaríamos esto para obtener un espacio de trabajo de monorepo con una estructura más modular? Bueno, en primer lugar, probablemente seguiríamos adelante y crearíamos las carpetas. Y por cierto, esto depende completamente de usted, cómo nombre esto. El nombre normal que se encuentra es como aplicaciones y paquetes o Apps y Lips. Pero depende de usted cómo elija esos. Y probablemente seguiríamos adelante y moveríamos nuestra aplicación Next en este caso a esta carpeta de aplicaciones. Como siguiente paso, necesitamos separar estas características y moverlas a su carpeta de paquetes. Así que son completamente independientes. Y como resultado, ahora también deberíamos hacer que todas estas sean autónomas en el sentido de que tengan su propio paquete.

3. Configuración de Monorepo y Vinculación de Paquetes

Short description:

Configuremos el Monorepo para hacer referencia a los paquetes localmente. Instalemos las dependencias en la raíz del paquete y vinculémoslas a la aplicación Next.js. Haremos referencia a las dependencias en el archivo package.json de la aplicación Next.js. Construyamos los paquetes para generar los archivos de salida necesarios. Ejecutemos la aplicación Next.js.

Sus propias dependencias, sus propios scripts de compilación y cosas así. Permítanme configurarlo rápidamente. Aquí vamos.

Ahora tenemos una carpeta de origen donde residen los archivos. Tenemos una configuración de compilación cercana aquí a la nuestra. Cada uno de estos paquetes ahora tiene su propio package.json con el script de compilación en este caso, y sus propias dependencias de desarrollo. Y la misma configuración se aplica también a ese paquete del sistema de design.

Ahora, el siguiente paso es configurar ese Monorepo para indicarle a NPM que cuando hagamos referencia a un paquete, lo haga localmente en lugar de globalmente. Para hacer eso, necesitamos un package.json a nivel de raíz aquí. Ese package.json es la configuración de nuestro Monorepo. Lo más importante es la propiedad del espacio de trabajo, que define cuáles son nuestras carpetas locales, dónde se deben vincular los paquetes entre sí. También puede tener algunas dependencias de desarrollo globales, así como dependencias que todos los paquetes del espacio de trabajo deben compartir entre sí.

Pero como siguiente paso, podemos continuar e instalar todas esas dependencias en la raíz del paquete. Con esto, ahora deberíamos poder vincular aquí nuestros paquetes a nuestra aplicación Next.js, porque obviamente nuestra importación anterior, como han visto aquí desde la carpeta de características local, ya no funciona porque esas características ya no existen. En su lugar, ahora deberíamos continuar y vincularlos a donde se han movido. Y así, en este caso, iría aquí para la característica de authentication e importarla desde aquí, mi org auth, así como aquí para esto, tendría aquí, mi org design system.

Pero también necesitamos hacer referencia a esas dependencias en nuestra aplicación Next.js. Así que iríamos aquí al package.json de nuestra aplicación Next.js en la carpeta de dependencias, y haríamos referencia aquí a mi org design system. Y podemos hacer referencia a ella con un asterisco porque no nos interesa una versión específica, aunque podríamos, pero preferimos consumir la última versión que se encuentra localmente aquí en nuestro espacio de trabajo. Y hacemos lo mismo para nuestra parte de autenticación.

Ahora instalemos las dependencias nuevamente para que npm pueda hacer la vinculación adecuada. Pero antes de poder consumirlas, también necesitamos compilar estos paquetes, porque obviamente dependen de la salida de compilación de convertir esto en un archivo JavaScript. Así que continuemos y construyamos eso. Podemos ejecutar npm run build y luego podemos darle la bandera de espacio de trabajo aquí y decir my org auth. Ahora deberíamos continuar y construir nuestra biblioteca de authentication. Y pueden ver aquí, produjo una carpeta dist, produjo archivos index DTS. Así que podemos hacer lo mismo aquí también para nuestra biblioteca del sistema de design. Entonces nuevamente ejecutamos la compilación y de manera similar obtendremos aquí una carpeta dist con los archivos compilados. Así que si ahora continuamos y ejecutamos nuestra aplicación Next.js.

4. Problemas con la Configuración y Dependencias

Short description:

En la configuración, hay algunos problemas en términos de la experiencia de desarrollo (DX). Necesitamos asegurarnos de que haya una compilación para los paquetes de autenticación y sistema de diseño. Si realizamos algún cambio en esos paquetes, necesitamos un proceso de observación para actualizar la aplicación.

Funcionaría perfectamente. Puedes ver aquí, obtenemos el nombre impreso, así como nuestro pequeño botón visualizado en la página web. Entonces, es posible que hayas notado que hay algunas cosas en la configuración que no son ideales, especialmente en términos de la experiencia de desarrollo (DX). Porque, por ejemplo, cada vez que ejecutamos nuestra aplicación Next.js, necesitamos asegurarnos siempre de que ya se haya realizado una compilación para nuestros paquetes de autenticación ydesign sistema de diseño. Por lo tanto, necesitamos tener esa carpeta dist ya existente porque nuestra aplicación Next depende de esas salidas de compilación. Y de manera similar, también, si realizamos algún cambio en esas carpetas de paquetes, necesitamos algún proceso de observación que actualice la aplicación actual.

5. Adding an X to the Monorepo Workspace

Short description:

Agregar una X al espacio de trabajo de Monorepo es sencillo. Ejecute el comando npx nx at latest y el script init para agregar el paquete nx. Configure los scripts que deben ejecutarse en orden, como el script de compilación. Nx tiene una función de almacenamiento en caché que permite seleccionar scripts que se pueden almacenar en caché. La configuración incluye un nuevo archivo NxJSON con operaciones almacenables en caché y un objetivo predeterminado. Al ejecutar el comando de compilación para un paquete o aplicación, se compilarán primero sus hijos y luego el propio paquete o aplicación. Los comandos Nx se pueden utilizar para mayor comodidad. Volver a ejecutar el comando de compilación utilizará la caché. La configuración se puede ajustar para ejecutarse en modo de desarrollo.

Ahora, agregar una X, por ejemplo, puede ayudar con algunas de estas cosas. Así que hagámoslo. Agregar una X es bastante sencillo. Ejecute el comando npx nx at latest y ejecute un script init. Lo que hará es agregar el paquete nx a este espacio de trabajo de Monorepo. Luego, se le harán algunas preguntas para configurarlo. En primer lugar, la primera pregunta es exactamente lo que mencioné antes. ¿Hay algún script que deba ejecutarse en orden? Nuestro script de compilación, como mencionamos anteriormente, definitivamente debe ejecutarse en orden porque necesitamos ejecutar primero las dependencias. De manera similar, una X tiene una función de almacenamiento en caché. Entonces pregunta qué scripts se pueden almacenar en caché. Def y start, probablemente no porque eso se trata realmente del desarrollo, pero build, def y potencialmente si tuviéramos scripts de prueba o linting, también se podrían almacenar en caché. Así que seleccionemos build aquí. Incluso podríamos personalizar la carpeta de salida si hay alguna, pero lo más común es que esta build, publish, public ya estén cubiertas y también si queremos habilitar el almacenamiento en caché distribuido. Así que definitivamente podemos optar por instalarlo. Ahora, lo que tenemos aquí en esta configuración es un nuevo archivo NxJSON. En primer lugar, hay una nueva dependencia con una X aquí en nuestro archivo package.json en la raíz. También tenemos este paquete NxCloud porque optamos por el almacenamiento en caché distribuido. Y la parte más interesante aquí es ese archivo NxJSON, que tiene las operaciones almacenables en caché definidas y el objetivo predeterminado también. Esto es exactamente el tipo de operación del que hablé antes, que se asegura de que cuando ejecutamos la compilación de algún paquete o aplicación, se ejecute primero la compilación de todos sus hijos y luego la compilación del propio paquete o aplicación. Probemos esto de inmediato. Si, por ejemplo, eliminamos aquí las carpetas dist de auth y del sistema de diseño y luego ejecutamos la compilación de mi próxima aplicación, ahora también puedes usar los comandos Nx, que son más prácticos porque simplemente podemos ejecutar Nx build y luego elegir mi org my next app. Y puedes ver que ahora se ejecutan las compilaciones de dos proyectos dependientes, que son exactamente nuestras dependencias que tenemos. Y luego se ejecuta la compilación real de nuestra aplicación Next.js. Y la parte genial es que, si volvemos a ejecutar esto, está en caché. Por lo tanto, se dividiría inmediatamente y incluso podemos configurar esta configuración. Podemos seguir adelante y decir que no solo queremos ejecutar esto para el comando de compilación real, sino también si ejecutamos en modo de desarrollo para nuestra configuración.

6. Aprovechando la Configuración del Monorepo

Short description:

Para aprovechar la parte de migración, agregamos una aplicación remix a la configuración del monorepo. Los paquetes están vinculados a la aplicación remix, lo que nos permite importarlos y usarlos. Al precompilar los proyectos dependientes y ejecutar la aplicación remix, podemos ver la configuración flexible y configurable en acción. Otra opción de configuración es el espacio de trabajo de monorepo integrado, que viene preconfigurado con complementos para simplificar el desarrollo. Con la extensión de consola Ennex, podemos generar y configurar bibliotecas de React y JavaScript, vinculándolas automáticamente con la configuración global de TS base.

Entonces, ahora que tenemos este espacio de trabajo, esta configuración de monorepo configurada, ¿cómo podemos aprovechar esta parte de migración? Bueno, agreguemos una aplicación remix. Lo único que voy a hacer es ingresar al directorio de aplicaciones y luego ejecutar el comando create remix app. Lo llamaré mi aplicación remix. Solo quiero tener lo básico, el servidor de aplicaciones remix. Quiero tener TypeScript y luego puedo agregarlo a mi espacio de trabajo. Si navego hasta la raíz de mi paquete y ejecuto npm nuevamente, se configurará y reconocerá mi aplicación remix, que está junto a mi aplicación Next.

Ahora que tenemos esta configuración, podemos enlazar los paquetes de la misma manera que lo hicimos en nuestra aplicación Next.js. Puedo tomar estos dos paquetes, ir a la aplicación remix y agregarlos también aquí en mi sistema, y ahora puedo importarlos desde las rutas de remix. Ahora tenemos nuestros botones importados aquí. Podemos seguir adelante y decir `bienvenido a remix`. Y eso está aquí. Coloquemos nuestro botón justo debajo. Instalemos las dependencias para que npm pueda vincular todo. Y ahora podemos ejecutar nuestra aplicación remix. Primero, nuevamente, precompilamos nuestros dos proyectos dependientes, como la autenticación y la biblioteca del sistema de diseño, pero ahora, si vamos a localhost:3000, tenemos nuestra aplicación remix en funcionamiento y también tenemos el botón incluido.

Lo que hemos visto aquí es una configuración muy flexible donde podemos configurar las herramientas como queramos. Pero para que también funcionen, debemos configurarlas. Esto es lo que llamamos una configuración de monorepo basada en paquetes, donde todos estos paquetes son potencialmente independientes, tienen sus propias dependencias, puedes elegir las herramientas de compilación que deseas tener y debes configurarlo todo para que funcione como se pretende. Ahora permíteme mostrarte una configuración diferente, que llamamos espacio de trabajo de monorepo integrado, que Ennex es capaz de configurar para ti. Y la diferencia es que viene preconfigurado, también es más opinativo, pero tiene un conjunto de complementos que te ayudan en el desarrollo de tu proyecto. Entonces, en este caso, nuevamente tenemos nuestra aplicación Next.js, pero por ejemplo, también para nuestros paquetes o bibliotecas, podemos generarlos, podemos configurarlos previamente y no tenemos que preocuparnos por cómo se realiza la configuración. Al tener instalada esta extensión de consola Ennex, incluso puedo hacer clic derecho y seleccionar aquí una biblioteca de React, que es mi sistema de diseño que quiero configurar. Y que se genere para mí, y esto configuraría el sistema de diseño de una manera determinada con una carpeta lib, algunas facilidades aquí que luego puedo consumir desde mi aplicación. De manera similar, puedo configurar mi biblioteca de autenticación, pero en este caso, puedo decir que es solo una biblioteca de JavaScript normal. No hay React en ella. Así que elijo el complemento de JavaScript novedoso y defino mi paquete de autenticación y lo genero también. Todo esto se configura automáticamente y se vincula con nuestra configuración global de TS base en el nivel raíz.

7. Actualización automática en la carpeta Auth

Short description:

En esta configuración, la aplicación se actualiza automáticamente cada vez que se realiza un cambio en la carpeta Auth. No se requiere ninguna configuración adicional ni scripts.

La experiencia aquí es muy agradable porque lo que podemos hacer aquí, por ejemplo, si devuelvo el nombre, puedo ir aquí y hacer referencia a eso. Y cuando ejecuto mi aplicación, se actualizará automáticamente cada vez que cambie algo en esa carpeta Auth. Así que puedo seguir adelante y servir aquí mi aplicación Next. Y si navego a 4200, verás aquí mi aplicación Next en funcionamiento. Veo aquí a John Doe. Y si vuelvo a mi aplicación Auth en mi biblioteca Auth y agrego un par de signos de exclamación, vuelvo atrás y verás que se actualiza automáticamente. Esto ya está configurado para ti. No tienes que configurar ningún paso predefinido ni scripts de observación, sino que esto funciona de inmediato.

8. Adding Remix App and Integrated Setup

Short description:

Para agregar una aplicación de Remix, instala el paquete de Remix y genera una nueva aplicación de Remix. Haz referencia e importa las cosas de la misma manera que en la aplicación de Next.js. Ejecuta la aplicación de Remix y se cargará, mostrará a John Doe y funcionará con actualización en vivo. La configuración integrada preconfigura el stack y proporciona generadores para acciones de Remix, cargadores y metadatos.

Entonces, ¿qué pasa si quiero agregar ahora una aplicación de remix a esto? Bueno, puedo simplemente instalar el paquete de remix, el complemento de remix aquí. Y una vez que tenga el complemento instalado, puedo generar una nueva aplicación de remix, así que puedo ejecutar NX generar aplicación. Ahora debería ver la aplicación de Remix. Le doy el nombre, puedo darle un par de opciones si están disponibles, y luego genero la aplicación de remix dentro de mi carpeta de aplicaciones como hicimos antes.

Y ahora que tengo mi aplicación de remix configurada aquí, puedo simplemente hacer referencia e importar las cosas de la misma manera que en mi aplicación de Next.js. Así que vuelvo a mi aplicación de remix dentro de la carpeta de rutas. Importo el paquete de autenticación y lo uso de la misma manera. Vamos a ejecutar la aplicación de remix. Entonces, si cargamos la aplicación de remix, podemos ver que se carga, muestra a John Doe y también funciona con actualización en vivo. Así que si vuelvo a mi parte de autenticación aquí, elimino los signos de exclamación de nuevo, vuelvo atrás, puedes ver que ya se actualizó y visualizó el resultado para mí. Y esto es solo la punta del iceberg aquí. La principal ventaja de esta configuración integrada es que preconfigura el stack para ti. Así que puedes centrarte en la estructura de tu espacio de trabajo, pero no tienes que preocuparte por cómo construirlos, dónde preconstruirlos y, además, viene con facilidades como esos generadores, que hemos visto, que pueden hacer aún más, como generar acciones de remix, cargadores, metadatos para tus rutas y mucho más.

9. Benefits of Modular Structure and Nx

Short description:

En un espacio de trabajo de monorepo, las aplicaciones se vuelven delgadas y se encargan del empaquetado, mientras que los paquetes están encapsulados con límites bien definidos. Esto permite una portabilidad y escalabilidad sencillas con equipos que trabajan en paquetes específicos. La estructura modular permite pruebas aisladas y diversificación del stack con diferentes tecnologías. Nx ayuda a gestionar y escalar la configuración, ofreciendo beneficios como una actualización rápida y configuraciones predefinidas. Nx también proporciona funciones como el almacenamiento en caché local y remoto y una extensión dedicada de Visual Studio Code.

Entonces, ¿qué es más, esto realmente es un enfoque diferente para organizar y estructurar tu código en un espacio de trabajo de monorepo. Porque lo que sucede aquí es que tus aplicaciones en la parte superior se vuelven muy, muy delgadas y realmente solo son la parte de empaquetado de tu configuración específica de etiqueta. Aquí es donde incluyes los componentes en tu enrutamiento, cómo esa etiqueta específica como la configuración de Next.js o Remix lo demanda, mientras que los paquetes allá abajo están más encapsulados, están bien definidos, generalmente tienen límites de API bien definidos e incluso pueden ser independientes de la etiqueta.

Entonces, no tienen que serlo, porque algunos de ellos pueden ser cosas específicas de una función donde incluso exponemos cargadores de Remix, que se incluyen en una aplicación de Remix. Pero cosas como los flujos de trabajo de autenticación pueden ser totalmente independientes de la etiqueta y estar escritos en puro TypeScript. Y como puedes imaginar, esto permite una portabilidad mucho más fácil de las características. Y aunque tengas que refactorizar cosas, es mucho más fácil si ya se han extraído.

Lo que también obtienes de manera más interesante es que puedes ejecutar, por ejemplo, la visualización de un gráfico. Esto es específico de Nx, donde puedes ejecutar un gráfico de Nx y te mostrará la estructura de tu aplicación. Ahora, en nuestra configuración súper simple, solo tenemos dos aplicaciones que dependen de ambos paquetes. Pero en una configuración más avanzada, esto puede volverse más complicado. Y lo más importante, este tipo de configuración también se escala con tu equipo. Ahora es muy fácil asignar equipos a esos paquetes específicos donde uno trabaja en la parte de autenticación, hay otro grupo de personas y desarrolladores que trabajan en la parte del sistema de diseño, que se comparte más en diferentes aplicaciones que puedas tener. Pero luego también hay características como una lista de productos, donde otro equipo trabaja que se centra en el aspecto comercial de la aplicación. Y ahora que tienes esos paquetes más detallados, incluso puedes ejecutar las pruebas en un modo aislado solo contra la lista de productos, solo la parte de autenticación. Por lo tanto, es aún más fácil averiguar qué está fallando si las pruebas fallan porque son fácilmente identificables. Y además, si ahora ejecutas esto incluso en CI, dado ese gráfico que ahora está presente, es imposible ejecutar solo las cosas que se han modificado. Por ejemplo, digamos que modificamos un solo nodo en ese gráfico, entonces solo esos serían los que se prueban, construyen y vinculan en tu sistema de CI. Al mismo tiempo, esto también es una forma de diversificar tu stack. Porque como hemos visto, comenzamos desde una aplicación de Next.js y tenemos la intención de agregar una aplicación de Remix y luego migrar piezas. E incluso puedes tener múltiples aplicaciones, múltiples stacks de tecnología diferentes al mismo tiempo, que se implementan en diferentes tipos de destinos de tu organización. Y todo esto gracias a esa estructura modular donde las aplicaciones están desacopladas de los paquetes modulares reales. Entonces, en particular, también hemos visto hoy cómo podemos implementar ese stack con Nx y cómo eso puede ayudar.

Ahora, hemos visto dos enfoques diferentes de cómo usar Nx en esta configuración. El primero es probablemente más ideal si ya tienes un stack existente. Entonces, digamos que ya tienes ese espacio de trabajo de npm en una configuración así. Pero ahora quieres agregar Remix a eso y quieres que Nx te ayude a gestionarlo y escalarlo a medida que crece. Si estás comenzando de nuevo, probablemente te inclines hacia el tipo de configuración más integrada, que ofrece muchos más beneficios, como toda esa actualización rápida. La observación ya funciona. Pero al mismo tiempo, te brinda esa configuración predefinida donde no tienes que preocuparte por todos los detalles de nivel inferior por tu cuenta. La parte interesante aquí es realmente que Nx te ayuda no solo a escalar a medida que creces con características como el almacenamiento en caché local y remoto, sino que también viene con algunos aspectos agradables de DX, como una extensión dedicada de Visual Studio Code que puede ayudarte a desarrollar a largo plazo. Entonces, si esto suena interesante, definitivamente únete y síguenos en Nx Dev Tools, en Nx.dev, que es el sitio web principal, o también únete a nuestro Slack de la community, que puedes encontrar en la diapositiva aquí. Gracias por ver.

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

Una Guía del Comportamiento de Renderizado de React
React Advanced 2022React Advanced 2022
25 min
Una Guía del Comportamiento de Renderizado de React
Top Content
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.
Construyendo Mejores Sitios Web con Remix
React Summit Remote Edition 2021React Summit Remote Edition 2021
33 min
Construyendo Mejores Sitios Web con Remix
Top Content
Remix is a web framework built on React Router that focuses on web fundamentals, accessibility, performance, and flexibility. It delivers real HTML and SEO benefits, and allows for automatic updating of meta tags and styles. It provides features like login functionality, session management, and error handling. Remix is a server-rendered framework that can enhance sites with JavaScript but doesn't require it for basic functionality. It aims to create quality HTML-driven documents and is flexible for use with different web technologies and stacks.
Compilador React Forget - Entendiendo React Idiomático
React Advanced 2023React Advanced 2023
33 min
Compilador React Forget - Entendiendo React Idiomático
Top Content
Joe Savona
Mofei Zhang
2 authors
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.
Uso efectivo de useEffect
React Advanced 2022React Advanced 2022
30 min
Uso efectivo de useEffect
Top Content
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.
Enrutamiento en React 18 y más allá
React Summit 2022React Summit 2022
20 min
Enrutamiento en React 18 y más allá
Top Content
Routing in React 18 brings a native app-like user experience and allows applications to transition between different environments. React Router and Next.js have different approaches to routing, with React Router using component-based routing and Next.js using file system-based routing. React server components provide the primitives to address the disadvantages of multipage applications while maintaining the same user experience. Improving navigation and routing in React involves including loading UI, pre-rendering parts of the screen, and using server components for more performant experiences. Next.js and Remix are moving towards a converging solution by combining component-based routing with file system routing.
Concurrencia en React, Explicada
React Summit 2023React Summit 2023
23 min
Concurrencia en React, Explicada
Top Content
React 18's concurrent rendering, specifically the useTransition hook, optimizes app performance by allowing non-urgent updates to be processed without freezing the UI. However, there are drawbacks such as longer processing time for non-urgent updates and increased CPU usage. The useTransition hook works similarly to throttling or bouncing, making it useful for addressing performance issues caused by multiple small components. Libraries like React Query may require the use of alternative APIs to handle urgent and non-urgent updates effectively.

Workshops on related topic

Masterclass de Depuración de Rendimiento de React
React Summit 2023React Summit 2023
170 min
Masterclass de Depuración de Rendimiento de React
Top Content
Featured Workshop
Ivan Akulov
Ivan Akulov
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 🤐)
Next.js para Desarrolladores de React.js
React Day Berlin 2023React Day Berlin 2023
157 min
Next.js para Desarrolladores de React.js
Top Content
Featured WorkshopFree
Adrian Hajdin
Adrian Hajdin
En esta avanzada masterclass de Next.js, profundizaremos en conceptos clave y técnicas que permiten a los desarrolladores de React.js aprovechar al máximo Next.js. Exploraremos temas avanzados y prácticas prácticas, equipándote con las habilidades necesarias para construir aplicaciones web de alto rendimiento y tomar decisiones arquitectónicas informadas.
Al final de esta masterclass, serás capaz de:1. Comprender los beneficios de los Componentes del Servidor React y su papel en la construcción de aplicaciones React interactivas, renderizadas por el servidor.2. Diferenciar entre el tiempo de ejecución de Edge y Node.js en Next.js y saber cuándo usar cada uno en función de los requisitos de tu proyecto.3. Explorar técnicas avanzadas de Renderizado del Lado del Servidor (SSR), incluyendo streaming, fetching paralelo vs. secuencial, y sincronización de datos.4. Implementar estrategias de caché para mejorar el rendimiento y reducir la carga del servidor en las aplicaciones Next.js.5. Utilizar Acciones React para manejar la mutación compleja del servidor.6. Optimizar tus aplicaciones Next.js para SEO, compartir en redes sociales, y rendimiento general para mejorar la descubrabilidad y la participación del usuario.
Aventuras de Renderizado Concurrente en React 18
React Advanced 2021React Advanced 2021
132 min
Aventuras de Renderizado Concurrente en React 18
Top Content
Featured Workshop
Maurice de Beijer
Maurice de Beijer
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.
Consejos sobre React Hooks que solo los profesionales conocen
React Summit Remote Edition 2021React Summit Remote Edition 2021
177 min
Consejos sobre React Hooks que solo los profesionales conocen
Top Content
Featured Workshop
Maurice de Beijer
Maurice de Beijer
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.
Presentando FlashList: Construyamos juntos una lista performante en React Native
React Advanced 2022React Advanced 2022
81 min
Presentando FlashList: Construyamos juntos una lista performante en React Native
Top Content
Featured Workshop
David Cortés Fulla
Marek Fořt
Talha Naqvi
3 authors
En esta masterclass aprenderás por qué creamos FlashList en Shopify y cómo puedes usarlo en tu código hoy. Te mostraremos cómo tomar una lista que no es performante en FlatList y hacerla performante usando FlashList con mínimo esfuerzo. Usaremos herramientas como Flipper, nuestro propio código de benchmarking, y te enseñaremos cómo la API de FlashList puede cubrir casos de uso más complejos y aún así mantener un rendimiento de primera categoría.Sabrás:- Breve presentación sobre qué es FlashList, por qué lo construimos, etc.- Migrando de FlatList a FlashList- Enseñando cómo escribir una lista performante- Utilizando las herramientas proporcionadas por la biblioteca FlashList (principalmente el hook useBenchmark)- Usando los plugins de Flipper (gráfico de llamas, nuestro perfilador de listas, perfilador de UI & JS FPS, etc.)- Optimizando el rendimiento de FlashList utilizando props más avanzados como `getType`- 5-6 tareas de muestra donde descubriremos y solucionaremos problemas juntos- Preguntas y respuestas con el equipo de Shopify
React, TypeScript y TDD
React Advanced 2021React Advanced 2021
174 min
React, TypeScript y TDD
Top Content
Featured Workshop
Paul Everitt
Paul Everitt
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.