Monorepos de Node con Nx

Rate this content
Bookmark
Github

Varias apis y varios equipos en el mismo repositorio pueden causar muchos dolores de cabeza, pero Nx te tiene cubierto. Aprende a compartir código, mantener archivos de configuración y coordinar cambios en un monorepo que puede escalar tanto como tu organización. Nx te permite dar estructura a un repositorio con cientos de colaboradores y elimina las desaceleraciones de CI que normalmente ocurren a medida que crece la base de código.


Índice de contenidos:

- Laboratorio 1 - Generar un espacio de trabajo vacío

- Laboratorio 2 - Generar una api de node

- Laboratorio 3 - Ejecutores

- Laboratorio 4 - Migraciones

- Laboratorio 5 - Generar una biblioteca de autenticación

- Laboratorio 6 - Generar una biblioteca de base de datos

- Laboratorio 7 - Añadir un cli de node

- Laboratorio 8 - Limites de módulo

- Laboratorio 9 - Plugins y Generadores - Introducción

- Laboratorio 10 - Plugins y Generadores - Modificación de archivos

- Laboratorio 11 - Configuración de CI

- Laboratorio 12 - Caché distribuida

This workshop has been presented at Node Congress 2023, check out the latest edition of this JavaScript Conference.

FAQ

NX es una herramienta que ayuda a gestionar monorepos para proyectos utilizando múltiples tecnologías y lenguajes, facilitando la ejecución de comandos, compartición de código y la gestión de dependencias de manera eficiente.

Los monorepos con NX ofrecen cambios atómicos, permiten compartir código fácilmente y proporcionan un único conjunto de dependencias, lo que facilita la gestión y actualización de las mismas.

No, NX es agnóstico respecto al lenguaje y el marco de trabajo, por lo que puede utilizarse con diversos lenguajes como Java, Python, .NET, además de JavaScript.

NX ayuda a manejar un único conjunto de dependencias en un monorepo, lo que reduce los problemas de versiones incompatibles entre aplicaciones y facilita las actualizaciones de las mismas.

NX Cloud es una extensión de NX que ofrece almacenamiento en caché distribuido y ejecución de tareas distribuidas, optimizando los tiempos de compilación y pruebas al compartir resultados de tareas entre todos los miembros del equipo.

Isaac Mann
Isaac Mann
160 min
06 Apr, 2023

Comments

Sign in or register to post your comment.
Video Summary and Transcription
Esta masterclass explora los Monorepos de Node con NX, destacando los beneficios de los monorepos y NX en la gestión de la complejidad, el intercambio de código y la gestión de dependencias. Cubre la creación y uso de bibliotecas, la configuración de límites de módulo, el linting y la integración de CI/CD. La masterclass también introduce NX Cloud, que ofrece caché distribuida y ejecución de tareas para mejorar el rendimiento. En general, la masterclass proporciona ideas prácticas y herramientas para un desarrollo y una ingeniería de software eficientes en un entorno de monorepo.
Available in English: Node Monorepos with Nx

1. Introducción a Node Monorepos con NX

Short description:

Bienvenidos a Node Monorepos con NX. Esta masterclass estará orientada hacia Node como el marco de trabajo utilizado con NX. NX es agnóstico en cuanto a marcos de trabajo y lenguajes, lo que te permite utilizar aplicaciones de front-end como React o Angular, así como otros lenguajes como Java y Python. Los Monorepos ofrecen beneficios como cambios atómicos, fácil compartición de código y gestión simplificada de dependencias.

Muy bien, bienvenidos a Node Monorepos con NX. Esto es genial. Entonces yo soy, mi nombre es Isaac Mann. Soy un arquitecto en NX. Hemos estado, he estado trabajando con NX durante cuatro años. He sido empleado de NX durante cuatro años. Lo utilicé durante dos años antes de eso. Y sí, esto es emocionante. Así que esta masterclass estará orientada hacia Node como el marco de trabajo que estaremos utilizando con NX. Pero NX es, ya sabes, es prácticamente marco de trabajo y lenguaje agnóstico. Pero entraremos en eso más adelante. Así que es, ya sabes, puedes utilizar aplicaciones de front-end como React o Angular o ya sabes, cualquier otra tecnología de front-end que estés utilizando. Tú también puedes utilizar otros lenguajes como obviamente la gente utiliza Java y Python y .NET con NX. Así que NX se trata de, ya sabes, gestionar tu base de código y cualquier código que estés utilizando es esto es Node monorepos con NX. Y primero, vamos a empezar con una pequeña discusión de, por qué querrías un monorepo. Así que un monorepo es cualquier repositorio que tiene más de una aplicación viviendo en esa, en esa base de código. Entonces, ¿cuál es el beneficio de un monorepo? Así que tres categorías grandes de beneficios para monorepos. Monorepo te da cambios atómicos, te permite compartir fácilmente tu código y te da un único conjunto de dependencias, facilitando la gestión de esas dependencias. Así que vamos a profundizar en cada una de estas tres cosas y explicar

2. Beneficios de Monorepo y NX

Short description:

Un monorepo ofrece beneficios como cambios atómicos, fácil compartición de código y gestión simplificada de dependencias. Permite una ejecución de comandos más rápida, pruebas dirigidas para proyectos afectados y almacenamiento en caché local y distribuido. NX proporciona herramientas para ayudar a lograr los beneficios de un monorepo sin los inconvenientes de la colocación de código. Permite compartir código de manera controlada y una gestión eficiente de las dependencias.

qué son y por qué son beneficiosos. Entonces, si tuvieras una aplicación y una especie de biblioteca que es utilizada por esa aplicación. Y si los gestionas en dos repositorios separados, digamos que haces un cambio en la biblioteca UI que está en el repositorio dos en la parte inferior aquí. Si haces un cambio en ella, y por alguna razón rompe la aplicación de la página de inicio, el ciclo de vida de ese cambio sería que alguien hace un cambio en la biblioteca común UI. Suben el commit, en algún momento después alguien intenta usar esa nueva versión de la biblioteca común UI en la aplicación de la página de inicio. Se dan cuenta de que hay un cambio que rompe su aplicación. Entonces presentan un error con la biblioteca común UI, y dicen, Oye, tienes que arreglar esto. Y luego, una vez que el desarrollador de la biblioteca UI ve ese problema, hacen el cambio, suben una nueva corrección, una nueva versión, y luego las personas de la aplicación de la página de inicio tienen que actualizar la versión a la versión corregida, y luego ver si arregló su aplicación. Así que ese ciclo completo, normalmente, en el mejor de los casos tarda unos días, puede llevar una semana o dos si las personas no están trabajando en estas cosas a tiempo completo. Entonces, uno de los problemas aquí es, si pusieras ambas, la biblioteca y la aplicación juntas en el mismo repositorio, entonces ese ciclo sería, sería solo el creador de la biblioteca UI, haciendo un cambio, ejecutando las pruebas y viendo Oh, rompí las pruebas en la aplicación de la página de inicio, tengo que arreglar eso. Y eso, ese ciclo tomará como media hora o una hora. Incluso antes de que hayas subido un PR, te darías cuenta de que rompiste la aplicación, tienes que modificar tu code. Entonces, tienes en un PR, ya sabes, todos los cambios que necesitas hacer a la aplicación o los cambios que necesitas hacer en la biblioteca UI para adaptarse a la aplicación. Eso es un beneficio de un monorepo. El segundo beneficio es compartir code. Digamos que tienes alguna lógica sobre qué es un nombre de usuario válido. Y esta función, obviamente, en diferentes escenarios, tendrías una función más compleja que esta, estás manejando si el nombre de usuario es válido. Pero digamos que quieres compartir esto a través de tu aplicación a través de múltiples aplicaciones, múltiples bibliotecas. Si esto alguna vez cambiara, tendrías que actualizar eso en cada repositorio que lo esté utilizando. Si estás copiando el code de repositorio a repositorio, mientras que si estás en un entorno de monorepo, puedes simplemente usar esta función. Y cuando esa función cambia, entonces tu comportamiento cambia en todo el repositorio, donde sea que se esté utilizando. Así que compartir code fácilmente. La tercera cosa es tener un único conjunto de dependencias. Entonces, si tienes un framework como Node, o en este caso, en la imagen es react, si tienes diferentes versiones de ese framework siendo utilizadas en diferentes aplicaciones, puedes encontrarte con errores de tiempo de ejecución muy extraños y difíciles de debug. Y, y tener tu code en el mismo repositorio básicamente te obliga a tener, bueno puedes establecer reglas para obligarte a estar en la misma versión para todo lo que está en ese repositorio. Es posible tener múltiples versiones del mismo monorepo, pero es, es mejor tener una sola versión y facilitar las cosas a largo plazo. Así que básicamente en un entorno grande cuando tienes múltiples aplicaciones, normalmente tienes una aplicación en la que estás trabajando todo el tiempo, que está en la última versión de las dependencias que tienes, pero si vas a tener, ya sabes, dos o tres otras aplicaciones que se trabajan tal vez una vez cada par de meses y esas inevitablemente se quedan atrás y tienes que recordar, ¿cómo actualicé ese framework? Um, ya sabes, esto, la actualización de hace seis meses, y tienes que recordar y pasar por todo ese mismo trabajo de nuevo. Um, mientras que si estuvieras actualizando todas tus aplicaciones, todas tres aplicaciones al mismo tiempo, es mucho más fácil que actualizar tres aplicaciones diferentes, en diferentes momentos a lo largo de un año y medio. Um, así que lo haces todo de una vez y es mucho más fácil que hacerlo repartido en un año o cuando pienses en actualizar esas aplicaciones. Bien. Entonces, una forma de, ya sabes, tener un monorepo, um, la diferencia entre un monorepo y la colocación de code y la colocación de code es cuando simplemente juntas todas las aplicaciones en el mismo repositorio sin tener ninguna tooling para gestionar eso. Y eso, eso puede ser una pesadilla. Si simplemente lo juntas todo, um, puedes terminar con un escenario en el que estás ejecutando pruebas innecesarias. No tienes límites de code y todo el code se mezcla y es difícil de mantener. Um, y puedes tener tooling inconsistente donde tienes conflictos entre cómo esas herramientas interactúan entre sí como tus herramientas de testing o tus otras herramientas que tengas. Um, entonces, hablemos de ejecutar pruebas innecesarias. Digamos, um, que tienes una biblioteca llamada la página de inicio del producto. Um, que está utilizando el producto compartido UI. Si hicieras un cambio solo en el proyecto de la página de inicio del producto, um, sabes que necesitas ejecutar las pruebas para ese proyecto para asegurarte de que no rompiste nada. Pero, ya sabes, también sabes que no tienes que ejecutar las pruebas en el producto compartido UI porque, ya sabes, no hay forma posible de que puedas haber roto la prueba en el producto compartido UI. Si lo único que cambiaste fue este proyecto superior. Entonces, si no tienes ninguna tooling configurada en tu repositorio, que entienda tu gráfico de dependencias aquí, um, y para asegurarte de que no rompiste nada, tendrías que ejecutar las pruebas para todo en tu repositorio. Um, cada vez que haces un cambio en cualquier lugar en tu repositorio. Um, sería mejor tener alguna tooling para entender que solo necesito ejecutar pruebas en la página de inicio del producto, no en el producto compartido UI. Y esto obviamente es un, ya sabes, es un escenario muy simple, un repositorio real. Y este es incluso un pequeño ejemplo de repositorio aquí, este ejemplo, um, una configuración más típica sería algo como esto, donde tienes muchos nodos diferentes y necesitas algún, ya sabes, algún ordenador para entender qué pruebas realmente necesito ejecutar en lugar de tener a una persona tratando de recordar todas estas diferentes líneas del gráfico de dependencias. Um, para saber que tienes que ejecutar estas pruebas y no estas pruebas. Um, quieres asegurarte de ejecutar todas las pruebas que necesitas ejecutar, pero no las pruebas que no tienes que ejecutar. Bien, número dos, no hay límites de code. Entonces, si simplemente juntas todo, um, podrías tener algún code que escribas para, en tu biblioteca UI, que solo está destinado para que lo uses tú mismo, um, para que lo uses dentro de ese proyecto. Y no estás listo para que otras personas empiecen a usarlo todavía. No quieres mantener esa superficie de API. Um, pero no hay nada que impida a las personas entrar en tu, um, tu proyecto y, y usar alguna función que solo quieres para ti. Pero ellos dicen, Oh, hay code que me gusta, quiero usarlo. Y ahora porque lo están usando, estás atrapado manteniendo esa API y no puedes cambiar ella. Um, porque si la cambias, romperás su aplicación. Um, entonces necesitas alguna tooling configurada para decir, estas son las funciones que estoy, que estoy bien con que otras personas usen, y estas son funciones que son puramente internas y solo para, para mis proyectos, um, para usar.

Watch more workshops on topic

React a Escala con Nx
React Summit 2023React Summit 2023
145 min
React a Escala con Nx
Top Content
Featured WorkshopFree
Isaac Mann
Isaac Mann
Vamos a utilizar Nx y algunos de sus plugins para acelerar el desarrollo de esta aplicación.
Algunas de las cosas que aprenderás:- Generar un espacio de trabajo Nx prístino- Generar aplicaciones frontend React y APIs backend dentro de tu espacio de trabajo, con proxies preconfigurados- Crear librerías compartidas para reutilizar código- Generar nuevos componentes enrutados con todas las rutas preconfiguradas por Nx y listas para usar- Cómo organizar el código en un monorepositorio- Mover fácilmente las librerías alrededor de tu estructura de carpetas- Crear historias de Storybook y pruebas e2e de Cypress para tus componentes
Tabla de contenidos: - Lab 1 - Generar un espacio de trabajo vacío- Lab 2 - Generar una aplicación React- Lab 3 - Ejecutores- Lab 3.1 - Migraciones- Lab 4 - Generar una librería de componentes- Lab 5 - Generar una librería de utilidades- Lab 6 - Generar una librería de rutas- Lab 7 - Añadir una API de Express- Lab 8 - Mostrar un juego completo en el componente de detalle de juego enrutado- Lab 9 - Generar una librería de tipos que la API y el frontend pueden compartir- Lab 10 - Generar historias de Storybook para el componente de interfaz de usuario compartido- Lab 11 - Prueba E2E del componente compartido

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

Elevando Monorepos con los Espacios de Trabajo de npm
DevOps.js Conf 2022DevOps.js Conf 2022
33 min
Elevando Monorepos con los Espacios de Trabajo de npm
Top Content
NPM workspaces help manage multiple nested packages within a single top-level package, improving since the release of NPM CLI 7.0. You can easily add dependencies to workspaces and handle duplications. Running scripts and orchestration in a monorepo is made easier with NPM workspaces. The npm pkg command is useful for setting and retrieving keys and values from package.json files. NPM workspaces offer benefits compared to Lerna and future plans include better workspace linking and adding missing features.
Poner fin al dolor: Repensando CI para Monorepos Grandes
DevOps.js Conf 2024DevOps.js Conf 2024
25 min
Poner fin al dolor: Repensando CI para Monorepos Grandes
Today's Talk discusses rethinking CI in monorepos, with a focus on leveraging the implicit graph of project dependencies to optimize build times and manage complexity. The use of NX Replay and NX Agents is highlighted as a way to enhance CI efficiency by caching previous computations and distributing tasks across multiple machines. Fine-grained distribution and flakiness detection are discussed as methods to improve distribution efficiency and ensure a clean setup. Enabling distribution with NX Agents simplifies the setup process, and NX Cloud offers dynamic scaling and cost reduction. Overall, the Talk explores strategies to improve the scalability and efficiency of CI pipelines in monorepos.
Microfrontends Federados a Gran Escala
React Summit 2023React Summit 2023
31 min
Microfrontends Federados a Gran Escala
Top Content
This Talk discusses the transition from a PHP monolith to a federated micro-frontend setup at Personio. They implemented orchestration and federation using Next.js as a module host and router. The use of federated modules and the integration library allowed for a single runtime while building and deploying independently. The Talk also highlights the importance of early adopters and the challenges of building an internal open source system.
Escala tu aplicación de React sin micro-frontends
React Summit 2022React Summit 2022
21 min
Escala tu aplicación de React sin micro-frontends
This Talk discusses scaling a React app without micro-frontend and the challenges of a growing codebase. Annex is introduced as a tool for smart rebuilds and computation caching. The importance of libraries in organizing code and promoting clean architecture is emphasized. The use of caching, NxCloud, and incremental build for optimization is explored. Updating dependencies and utilizing profiling tools are suggested for further performance improvements. Splitting the app into libraries and the benefits of a build system like NX are highlighted.
La Era de los Monorepos
JSNation 2022JSNation 2022
25 min
La Era de los Monorepos
Today's Talk is about the world of monorepos, their history, benefits, and features. Monorepos address challenges in web development, such as slow build processes and unstable connections on mobile devices. Collocation in monorepos enables easy sharing of functions and components among projects. Speed and efficiency in monorepos are achieved through collocation, dependency graphs, and task orchestration. Monorepo tools like Learnr offer features such as caching and distributed task execution. Monorepos provide code sharing, consistent tooling, and automated migration, resulting in a 10x developer experience.
Remixando tu Stack en un Espacio de Trabajo Monorepo
Remix Conf Europe 2022Remix Conf Europe 2022
22 min
Remixando tu Stack en un Espacio de Trabajo Monorepo
Let's talk about remixing our stack in a Monorepo workspace, which allows for incremental migration and is suitable for transitioning from a Next.js app to a remix stack. Refactoring may be required for feature-specific and Next.js-coupled components, but the process is simplified because the features have already been moved out. Configuring the Monorepo to reference packages locally and linking them to the Next.js application is necessary. Nx provides benefits like fast refreshing, pre-configured setups, and features like local and remote caching.