El panorama de herramientas en 2026
Las dos capas que no hay que confundir en un monorepo: la del workspace, donde pnpm resuelve, enlaza y selecciona, y la de orquestación de tareas, donde Turborepo o Nx hashean, memoizan y cachean. Dónde encaja cada una, qué aporta el remote caching y cómo elegir la pila en 2026.
El error más común al montar un monorepo en 2026 es tratar “las herramientas de monorepo” como una sola caja y preguntarse cuál elegir, cuando en realidad hay dos capas distintas que hacen cosas ortogonales. Abajo, la capa del workspace —pnpm— resuelve el grafo de paquetes, enlaza node_modules y selecciona qué construir. Encima, la capa de orquestación —Turborepo o Nx— modela el grafo de tareas, hashea sus entradas y reutiliza sus salidas. No compiten: se componen. Entender dónde termina una y empieza la otra es lo que convierte un puñado de herramientas en una arquitectura.
- Separar la capa de workspace de la capa de orquestación de tareas y sus responsabilidades.
- Situar pnpm en 2026: store por contenido, catalogs, selección por
--filtery afectados. - Contrastar Turborepo y Nx: dónde encaja cada uno y qué aporta el remote caching.
- Elegir la pila según escala, con criterio y sin sobredimensionar.
Dos capas que no hay que confundir
Toda la confusión se disuelve al dibujar la pila. La capa de abajo gestiona dependencias y enlace: qué versiones se instalan, cómo se materializa node_modules, cómo se enlazan los paquetes internos. La capa de arriba gestiona trabajo: qué tareas hay que correr, en qué orden, cuáles ya se hicieron y no hace falta repetir. pnpm no cachea salidas de tareas; Turborepo y Nx no gestionan node_modules. Cada una ignora deliberadamente lo que hace la otra.
flowchart TD DEV[tu codigo y tus scripts] --> ORCH[capa de tareas Turborepo o Nx] ORCH --> PKG[capa de workspace pnpm] PKG --> FS[node_modules store y symlinks] ORCH -.-> RC[remote cache reutilizado entre CI y equipo] style ORCH fill:#89b4fa,color:#11111b style PKG fill:#a6e3a1,color:#11111b style RC fill:#cba6f7,color:#11111b
Un ejemplo hace tangible la composición. pnpm declara el workspace; Turbo o Nx declaran las tareas encima; ninguno pisa al otro y cada archivo habla de su capa:
# pnpm-workspace.yaml (capa de workspace: paquetes y linking)
packages: ["apps/*", "packages/*"]
// turbo.json (capa de tareas: dependencias entre tareas y outputs)
{ "tasks": { "build": { "dependsOn": ["^build"], "outputs": ["dist/**"] } } }
La composición es literal: instalas con pnpm, orquestas con Turbo o Nx, y cada turbo run build o nx build acaba invocando los scripts que pnpm dejó disponibles. Confundir las capas lleva a preguntas mal planteadas —“¿pnpm o Turborepo?”— cuando la respuesta casi siempre es “pnpm y uno de los dos”. La única elección real de la capa de abajo es pnpm frente a npm, yarn o bun workspaces; la de la capa de arriba es Turborepo frente a Nx —o nada, si el repo aún es pequeño.
Hay una prueba sencilla para saber a qué capa pertenece un problema: si tu dolor es “se instala mal”, “hay dos versiones de React” o “no encuentro un paquete”, es de la capa de workspace; si es “el build tarda”, “el CI recompila lo que no cambió” o “quiero compartir resultados entre máquinas”, es de la capa de tareas. Clasificar el síntoma en la capa correcta es la mitad de resolverlo, y evita el error de buscar la solución en la herramienta equivocada.
La capa de workspace: pnpm en 2026
pnpm es el estándar de facto de la capa inferior, y por buenas razones técnicas. Su store direccionado por contenido guarda cada versión de cada paquete una sola vez en disco y la enlaza por hard link a cada proyecto, así que diez apps que usan la misma versión de React ocupan el espacio de una. Su node_modules estricto —sin hoisting mentiroso— impide las dependencias fantasma: solo puedes importar lo que declaraste. Y para el monorepo aporta el protocolo workspace:, los --filter para actuar sobre subgrafos y los catalogs para la política de versión única.
pnpm --filter "@acme/web..." build # web y todo de lo que depende
pnpm --filter "...@acme/utils" test # utils y todo lo que depende de el
pnpm --filter "...[origin/main]" build # solo lo cambiado desde main
Ese último --filter merece atención: pnpm sí sabe seleccionar por git qué paquetes cambiaron desde un ref, un primo pobre del “affected”. Lo que no hace es recordar si la salida de una tarea ya se calculó. Selecciona y ordena; no memoiza. Junto a los catalogs —una versión central referenciada con catalog: desde cada paquete— y a packageManager con corepack para clavar la propia versión de pnpm, la capa inferior queda cubierta: resolución reproducible, enlace eficiente y selección topológica. La velocidad de “no repetir trabajo” es, por diseño, tarea de la capa de arriba.
npm, yarn Berry y bun también ofrecen workspaces, y bun añade una velocidad de instalación notable que en 2026 lo ha vuelto una opción real. Aun así, pnpm sigue siendo la referencia por su node_modules estricto —que mata las dependencias fantasma— y por catalogs. Elijas el que elijas, la lección estructural no cambia: es la capa de resolución y enlace, nunca la que memoiza tareas.
La capa de tareas: Turborepo y Nx
Aquí viven las dos grandes opciones, y difieren en filosofía más que en objetivo.
Turborepo
Minimalista y de baja fricción. Un turbo.json describe el pipeline de tareas; hashea entradas, cachea salidas local y remotamente. Escrito en Rust. Ideal para “cachea mis scripts tal como están”.
Nx
Plataforma completa: project graph, generadores, executors, nx affected, fronteras de módulo y ejecución distribuida en Nx Cloud. Más potente y más opinado. Ideal a escala de organización y en repos poliglota.
Remote cache
La caché compartida entre máquinas: lo que construyó tu compañera esta mañana lo restaura tu CI esta tarde. El multiplicador real del monorepo. Ambas herramientas lo ofrecen.
Más allá de JS
Bazel y Buck2 para poliglota hermético a mega-escala; moon como task runner en Rust; bun workspaces asomando en la capa inferior. Nichos concretos, no el caso común.
Turborepo encarna el principio de mínima intrusión. Describes en turbo.json cómo se relacionan las tareas —“el build de un paquete depende del build de sus dependencias”— y Turbo se encarga de hashear, cachear y paralelizar respetando la topología. No te pide reestructurar el repo ni adoptar generadores: envuelve los scripts que ya tienes. Es la opción natural para un monorepo con pnpm que solo quiere dejar de recompilar lo que no cambió.
// turbo.json
{
"tasks": {
"build": { "dependsOn": ["^build"], "outputs": ["dist/**"] },
"test": { "dependsOn": ["build"] }
}
}
Con eso, la segunda corrida sin cambios no ejecuta nada: reproduce salidas y logs desde la caché.
$ turbo run build # segunda vez, sin cambios
Tasks: 12 successful, 12 total
Cached: 12 cached, 12 total FULL TURBO en 180ms
Nx apuesta por lo contrario: más estructura a cambio de más poder. Infiere un grafo de proyecto detallado, trae generadores y executors para estandarizar cómo se crean y construyen los paquetes, hace cumplir fronteras de módulo con etiquetas, y en Nx Cloud ofrece no solo caché remota sino ejecución distribuida —repartir las tareas de un pipeline entre varias máquinas efímeras—. A cambio pide adoptar sus convenciones. Brilla en organizaciones grandes, repos poliglota y equipos que quieren una plataforma, no solo una caché. Ambas, por cierto, movieron su núcleo de hashing y grafo a Rust en la ola de reescrituras de 2025-2026.
El multiplicador de ambas es el remote caching. La caché local ya evita que tú repitas trabajo; la remota evita que lo repita cualquiera. Sube las salidas hasheadas a un almacén compartido —Vercel, Nx Cloud o uno autohospedado en tu propio bucket— de modo que cuando tu CI va a construir un paquete que alguien ya construyó con las mismas entradas, lo descarga en lugar de compilarlo. Es lo que hace que un pipeline de veinte minutos baje a veinte segundos cuando el noventa por ciento del repo no cambió.
# conectar el remote cache: una vez, y el equipo entero lo comparte
turbo login && turbo link # cache remota gestionada
# o autohospedada, apuntando a tu propio almacen compatible
No compares por velocidad —ambas hashean y cachean bien— sino por cuánta opinión estás dispuesto a adoptar. Turborepo es una capa de caché que respeta tus scripts y tu estructura; la eliges cuando quieres resultados rápidos sin cambiar cómo trabajas. Nx es una plataforma que quiere modelar tu repo entero —generadores, executors, fronteras, ejecución distribuida—; la eliges cuando ese modelado te ahorra más de lo que te cuesta adoptarlo, algo que suele ocurrir a escala de organización o en repos con varios lenguajes.
Cómo elegir en 2026
La decisión se ordena por escala, no por moda. pnpm, siempre: es la capa inferior y no tiene rival práctico salvo preferencias concretas por bun. La capa de tareas se añade cuando duele: mientras el repo tenga pocos paquetes y el CI vaya sobrado, pnpm -r basta y sobra. Como regla de bolsillo:
- Repo pequeño, pocos paquetes: pnpm y
pnpm -r, nada más. La caché todavía no duele y añadirla es complejidad prematura. - Repo mediano que empieza a tardar: pnpm más Turborepo. Envuelve tus scripts, cachea local y remoto, cero reestructuración.
- Organización grande o poliglota: pnpm más Nx, por el grafo de proyecto, los generadores, las fronteras impuestas y la ejecución distribuida.
- Mega-escala hermética multi-lenguaje: Bazel o Buck2, asumiendo a conciencia su coste de adopción.
Una heurística transversal ayuda: añade una capa solo cuando el dolor que resuelve ya lo estés sintiendo. Meter Nx en un repo de cuatro paquetes, o remote caching antes de que el CI duela, es pagar complejidad por adelantado contra un problema que quizá nunca tengas. La pila correcta no es la más completa, es la más pequeña que resuelve tu dolor actual.
Nada de esto es una decisión irreversible tomada el día uno. Se empieza con pnpm, se añade Turborepo cuando los builds duelen, y se migra a Nx si un día el repo pide plataforma. Como cada capa es ortogonal, cambiar la de tareas no toca la de workspace: puedes probar Turbo, medir y reemplazarlo por Nx sin tocar tu pnpm-workspace.yaml. Esa independencia entre capas es justo lo que te permite decidir tarde y barato.
La caché remota es la mayor palanca de velocidad del monorepo: convierte el trabajo de una persona en ahorro para todo el equipo y para el CI. Pero una caché es tan fiable como su aislamiento. Si el hash de una tarea omite una entrada que sí influye en su salida —una variable de entorno, una versión de herramienta—, restaurarás una salida incorrecta; y si un actor puede escribir en la caché compartida, puede envenenarla, como recordaron los incidentes de cadena de suministro de 2025. Acota bien las claves de caché, protege los tokens de escritura y trata la caché remota con el mismo cuidado que cualquier artefacto de build compartido.
La pregunta con la que casi todo el mundo llega —“¿qué herramienta uso para mi monorepo?”— está mal formulada, y reformularla es la lección entera. No existe “la herramienta de monorepos”; existe una pila de capas donde cada una resuelve un problema que las demás ignoran a propósito. Abajo, pnpm resuelve el grafo de paquetes, materializa un node_modules honesto desde un store por contenido, enlaza lo interno con workspace:, unifica versiones con catalogs y selecciona subgrafos con --filter. Encima, un orquestador —Turborepo o Nx— construye el grafo de tareas, hashea las entradas de cada una, memoiza sus salidas y las comparte por la red, de modo que el trabajo se vuelve proporcional al cambio y no al tamaño del repo. Y aún más arriba, Changesets versiona y publica lo que sale al mundo. Cada capa hace una cosa y la hace bien, y el arte de montar un monorepo es componerlas, no encontrar una pieza mágica que lo haga todo. Entender esto tiene consecuencias prácticas inmediatas: dejas de comparar peras con manzanas —“pnpm contra Turborepo” es una comparación sin sentido, son capas distintas—, dejas de sobredimensionar —no metes Nx en un repo de cuatro paquetes— y empiezas a razonar por responsabilidades: ¿mi dolor es de resolución y enlace, o de repetir trabajo, o de versionar y publicar? Cada dolor tiene su capa y su herramienta. La madurez en 2026 no es dominar Turborepo o Nx de memoria, sino ver el monorepo como lo que es —un sistema estratificado donde la resolución, la memoización y la publicación son problemas separados— y elegir, para cada capa, la pieza más simple que resuelva el problema que de verdad tienes, ni una más.
- Dibuja las capas de tu monorepo actual —o de uno que quieras montar— y coloca en cada una la herramienta que la cubre. ¿Hay capas vacías o solapadas?
- Sobre pnpm, ejecuta
pnpm --filter "...[origin/main]" run buildy compara cuántos paquetes selecciona frente apnpm -r run build. Esa diferencia es lo que un orquestador cachearía. - Añade Turborepo con un
turbo.jsonmínimo, correturbo run builddos veces seguidas y observa el segundo pase restaurando desde caché en milisegundos. - Investiga qué te daría Nx que Turborepo no: prueba
nx graphen un repo de ejemplo y juzga si el grafo de proyecto, los generadores o la ejecución distribuida resuelven un dolor tuyo real. - Escribe, capa por capa, la pila mínima que tu repo necesita hoy. Si una capa está vacía porque aún no duele, déjala vacía a conciencia: sobredimensionar también es un error.