Turborepo: acelera las entregas con un alto rendimiento
DESARROLLO WEB, OPERACIONES.Cuando los equipos de desarrollo de software crecen y los proyectos se hacen más complejos, mantener la coherencia entre varios proyectos puede ser un reto. Es aquí donde el uso de un monorepo puede ser de gran ayuda.
Un monorepo es un repositorio que contiene múltiples paquetes, cada uno con su propio versionado y gestión de dependencias. De esta manera, se puede tener un mayor control y eficiencia en la gestión de los proyectos. Sin embargo, configurar un monorepo puede ser una tarea compleja, sobre todo cuando se trata de gestionar el proceso de compilación y despliegue. Es aquí donde entra en juego Turborepo, una solución efectiva para la gestión de un monorepo React.
¿Qué es Turborepo?
Turborepo es una herramienta basada en Rust que simplifica el proceso de configuración de monorepos, lo que significa repositorios que consisten en múltiples paquetes, cada uno con su propio versionado y gestión de dependencias. Esta herramienta agiliza el proceso de compilación de monorepos, eliminando la necesidad de intervención manual y proporcionando un canal de compilación declarativo que puede acelerar el canal hasta 10 veces.
La versatilidad de Turborepo destaca por su capacidad para trabajar con múltiples y frameworks, lo que lo convierte en una gran elección para los desarrolladores. Además, Turborepo utiliza Rust para proporcionar velocidad y fiabilidad en bases de código a gran escala.
¿Qué son monorepos?
El monorepo es una estrategia de gestión de código que consiste en mantener múltiples proyectos en un solo repositorio de Git. En lugar de tener un repositorio separado para cada proyecto, todos los proyectos se mantienen en un solo lugar. Esto permite a los desarrolladores compartir código y bibliotecas comunes entre proyectos, lo que mejora la eficiencia y la colaboración. Además, los miembros del equipo pueden obtener una vista general de todo el proyecto y las dependencias son fáciles de administrar.
Este enfoque innovador está ganando popularidad, y empresas como Google, Meta, Microsoft, Uber, Airbnb y Twitter lo están adoptando. En particular, el monorepo de Google se destaca como el más grande, con decenas de miles de contribuciones diarias y un tamaño impresionante de más de 80 terabytes.
Ventajas y limitaciones de los monorepos
Existen varias ventajas potenciales en el uso de un monorepo, pero a nivel más general, podemos destacar lo siguiente:
Visibilidad: Permite a los equipos ver toda la base de código (codebase) de la empresa sin tener que clonar y rastrear múltiples repositorios. Esto aumenta la colaboración y la contribución entre equipos.
Coherencia: Proporciona consistencia porque funcionalidades similares se pueden abstraer en una biblioteca compartida, como una biblioteca de componentes web para el diseño del sistema, configuraciones de slint, documentación, entre otros. Esto puede ser incluido directamente en los proyectos.
Gestión de dependencias: En un entorno de múltiples repositorios donde varios proyectos dependen de la misma dependencia de terceros, esa dependencia puede ser descargada o construida varias veces. En un monorepo, la compilación se puede optimizar fácilmente, ya que todas las dependencias referenciadas existen en la misma base de código. Además, las herramientas de monorepo pueden ayudar a visualizar todo el gráfico de dependencias de la aplicación.
Consolidados atómicos: Cuando los proyectos que trabajan juntos están contenidos en repositorios separados, las versiones necesitan sincronizar qué versiones de un proyecto funcionan con el otro. En un monorepo, este problema puede ser evitado, ya que los desarrolladores pueden cambiar múltiples proyectos atómicamente.
Integración continua y automatización (CI/CD): Un monorepo también es ideal para la integración continua y la automatización (CI/CD), ya que todo el código está unificado por defecto, lo que hace mucho más fácil compilar y probar todo junto.
Aunque los monorepos tienen muchas ventajas, es importante tener en cuenta que también tienen algunas desventajas. Lo más importante es el tamaño. Al trabajar con un monorepo, todos los proyectos se comprueban por defecto, lo que puede ocupar una gran cantidad de espacio de almacenamiento. A medida que el monorepo crece, también aumenta la cantidad de cosas que hay que probar y construir, lo que puede ralentizar el editor de código y hacer que el tiempo que tarda en ejecutarse en el servidor de integración continua después de cada confirmación sea más largo. Además, acceder a todo el código a través de un monorepo puede plantear nuevos problemas de seguridad.
Grandes beneficios de Turborepo
Entre los beneficios que ofrece Turborepo, podemos destacar:
Una configuración simplificada que automatiza el proceso de creación del monorepo.
Garantiza dependencias consistentes a través de los espacios de trabajo de Yarn, lo que reduce el riesgo de conflictos y errores.
Los proyectos dentro del monorepo pueden compartir código fácilmente, reduciendo la duplicación de código y mejorando la mantenibilidad.
Turborepo proporciona scripts para construir, probar y desplegar proyectos dentro del monorepo, lo que hace que estos procesos sean más simples y eficientes.
Características más destacables de Turborepo
Caché remoto
El cachóé remoto es una herramienta imprescindible para los desarrolladores, que les permite compartir sus compilaciones a escala global, lo que significa que no tienes que preocuparte por compilar el código de tu equipo en tu máquina local. La caché remota es como un Dropbox para tu carpeta "dist". La mejor parte es que Vercel ofrece una caché remoto gratuito para las compilaciones de Turborepo, incluso si no alojas tu aplicación en los servidores de Vercel.
Es, también, una forma de compartir artefactos de código compilados y de datos entre diferentes máquinas, lo que reduce significativamente el tiempo de compilación. Además, la caché remota identifica los artefactos necesarios y ya generados en el mismo código PR, y los recicla en diferentes máquinas. Esta técnica de reciclaje o reutilización se puede realizar durante el proceso de compilación de Vercel o mediante un CI/CD externo.
Poda o pruning con cualquier sistema de paquetes
La poda, también conocida como pruning en inglés, es un proceso que permite eliminar de manera eficiente el crecimiento excesivo del caché de compilación de forma automática. Esto se logra al crear un subconjunto de tu monorepo, incluyendo la poda de las dependencias en tu archivo de bloqueo. Para hacer esto posible, la herramienta que ofrece la poda debe implementar la lógica para cada gestor de espacio de trabajo por separado. Afortunadamente, con el comando turbo prune, podrás contar con soporte para los principales gestores de paquetes, incluyendo npm, yarn y pnpm.
Soporte para Polyrepo
Inicialmente, Turborepo estaba enfocado solamente en monorepo ya que este ejecuta muchas tareas, y Turborepo es excepcionalmente rápido en realizarlas. Ahora Turborepo también soporta polyrepo. La mayoría de los procesos CI/CD duplican mucho trabajo, por lo que aprovechar el caché de Turborepo también beneficiaría a polyrepo. Otras características de Turborepo incluyen:
Construcciones incrementales: Turborepo recordará lo que se ha construido y omitirá los cálculos existentes.
Context-aware hashing: Turborepo hace un seguimiento del contenido de los archivos, no de la fecha/hora, para identificar lo que necesita ser construido.
Cero sobrecarga en tiempo de ejecución: Turborepo no interferirá con el código en tiempo de ejecución ni alterará los mapas de fuentes.
Subconjuntos podados o pruning subsets: Acelera los despliegues generando un subconjunto del monorepo con sólo lo que se requiere para construir un objetivo específico.
Integración con Lerna: Si se está utilizando Lerna como el flujo de trabajo de publicación de paquetes, se puede utilizar Turborepo en paralelo para mejorar la ejecución de las tareas.
Perfiles en tu navegador: Es posible crear perfiles de construcción e importarlos en el navegador Edge o Chrome para identificar qué tareas se están ejecutando durante más tiempo.
¿Cuándo usar Turbo Repo?
Cada proyecto dentro del monorepo tiene su propio conjunto de herramientas de prueba, construcción, linting, etc. Aunque Turborepo es una excelente opción para la mayoría de los proyectos, será especialmente beneficioso para aquellos que necesiten lo siguiente:
Dependencias intensivas entre scripts
Ejecución de tareas en paralelo
Gestión de dependencias de alto nivel para JavaScript y TypeScript
Construcciones incrementales
Configuraciones uniformes de linting
Almacenamiento en caché de los pasos de construcción
Recarga de módulos en caliente para paquetes importados en una aplicación NextJS.
¿Para qué tipo de proyectos es ideal usar monorepos?
Esta herramienta es útil para proyectos con scripts interdependientes, una necesidad de ejecución de tareas en paralelo, gestión de dependencias de alto nivel para JavaScript y TypeScript, y un deseo de configuraciones uniformes de linting. Además, Turborepo ofrece soporte para construcciones incrementales y almacenamiento en caché de los pasos de construcción, lo que la convierte en una opción eficiente. Si se está trabajando con una aplicación NextJS y se desea la recarga de módulos en caliente para paquetes importados, Turborepo también lo ofrece. En general, los monorepos pueden tener dificultades para escalar debido a sus ecosistemas individuales, pero Turborepo puede ofrecer una solución eficiente y eficaz para su gestión.
Y debido a que está diseñado para trabajar con una variedad de lenguajes de programación y frameworks, Turborepo es una herramienta versátil que puede ayudarle a mejorar el rendimiento y la escalabilidad de sus proyectos.
Turborepo vs. Lerna
Cuando se trata de gestionar monorepos, hay dos herramientas populares a considerar: Turborepo y Lerna. Aunque ambas herramientas tienen objetivos similares, presentan algunas diferencias.
Lerna se enfoca en la gestión de paquetes dentro de un monorepo. Proporciona herramientas para versionar, publicar y gestionar dependencias, pero está más orientada a JavaScript y Node.js.
Por otro lado, Turborepo se centra en simplificar el proceso de configuración para crear un monorepo. Automatiza el proceso de construcción y despliegue, lo que puede acelerar significativamente el proceso. Además, es versátil y puede trabajar con una gran variedad de lenguajes de programación y frameworks.
Turborepo vs. Rush
Turborepo está optimizado para bases de código JavaScript y TypeScript, por lo que es una opción ideal para los desarrolladores que trabajan con estos lenguajes.
Por otro lado, Rush está diseñado para proporcionar un conjunto completo de herramientas para la gestión de paquetes dentro de un monorepo. Esto incluye el versionado, la publicación y la gestión de dependencias. Rush también es independiente del lenguaje, por lo que es una opción ideal para proyectos que utilizan una variedad de lenguajes de programación y frameworks.
Categoría | Lena | Turborepo | Rush |
---|---|---|---|
Configuración | La configuración de Lerna es bastante sencilla. Lerna puede utilizar npm, Yarn o pnpm Workspaces. La configuración de caché es un poco más complicada. | Turborepo incluye la configuración de caché por defecto. La configuración del archivo de configuración de canalización se hace manualmente. | Rush no se integra con npm Workspaces. Primero, se debe instalar Rush. Luego ejecutarlo para crear un nuevo repositorio y agregar los proyectos al archivo La gestión de dependencias es diferente. |
Rendimiento | Lerna puede ser lento de manera predeterminada, pero combinado con Nx, es rápido. Nx proporciona un sistema avanzado de caché que permite que Lerna sea significativamente más rápido que Turborepo. | Turborepo es un poco más lento que Lerna con Nx debido a que se restauran completamente los archivos de caché cada vez. Es más rápido para iniciar. | No hay muchos datos de referencia sobre el rendimiento de Rush. Debido a que admite caché, es probable que tenga un rendimiento similar al de Turborepo. |
Funcionalidades | Lerna incluye una amplia variedad de funciones, como el caché remoto y la creación de gráficos de dependencias. La capacidad de distribuir la ejecución de tareas es una de las características más interesantes, pero requiere Nx Cloud. | Turborepo tiene menos características que Lerna, pero incluye la caché por defecto y la posibilidad de configurar la canalización manualmente. | Rush tiene menos funciones que Lerna y Turborepo. |
En general, en términos de configuración, Turborepo y Lerna son bastante similares, aunque Turborepo es mejor debido a que la caché está habilitada por defecto. En cuanto al rendimiento, Lerna con Nx es el más rápido, seguido de Turborepo y luego Rush. En cuanto a las funcionalidades, Lerna tiene más características que Turborepo y Rush.
Aplyca y el desarrollo web
Somos especialistas en desarrollo y consultoría de tecnologías de desarollo web, y le ayudamos a crear experiencias digitales óptimas para sus clientes. Lo invitamos a conocer nuestros casos de éxito y a contactarnos para discutir las necesidades de sus proyectos.