lenec ru

← все посты

Turborepo vs Nx в 2026: что выбрать

19K

Когда монорепо вырастает за пределы 5-7 пакетов, скорость сборки и тестов начинает кусаться. Решение очевидное — кеширование и параллелизация. На рынке два больших инструмента: Turborepo и Nx. Они закрывают одну и ту же задачу, но делают это очень по-разному. Я работал с обоими в продакшене и расскажу, как выбрать.

Что общего

  • Оба инкрементально строят зависимости и запускают только то, что изменилось.
  • Оба умеют локальный и распределённый кеш.
  • Оба запускают задачи параллельно, учитывая зависимости.
  • Оба интегрируются с pnpm/npm/yarn workspaces.

Если у тебя репо из 3-5 пакетов, оба будут работать почти одинаково. Разница начинается, когда репо разрастается.

Turborepo: фокус на кеше и простоте

Turborepo — это инструмент, который делает одну вещь хорошо: считает граф задач и кеширует. Минимум настроек, максимум скорости.

Базовый turbo.json:

{
  "$schema": "https://turbo.build/schema.json",
  "tasks": {
    "build": {
      "dependsOn": ["^build"],
      "outputs": ["dist/**", ".next/**"]
    },
    "test": {
      "dependsOn": ["build"],
      "outputs": ["coverage/**"]
    },
    "lint": {},
    "dev": {
      "cache": false,
      "persistent": true
    }
  }
}

Запуск:

turbo run build
turbo run test --filter=@my-mono/web
turbo run lint --filter=...[origin/main]

Это всё. Кеш работает локально автоматически, удалённый — через интеграцию с Vercel Remote Cache (бесплатно для open-source и недорого для коммерческого использования).

Nx: полноценная платформа

Nx — это больше, чем просто запуск задач. Это:

  • Граф задач и кеш (как у Turborepo).
  • Генераторы (создать новый пакет, компонент, сервис одной командой).
  • Шаблоны для популярных стеков (React, Next, NestJS, Vue, Angular).
  • Анализ зависимостей с визуальным графом.
  • Свой облачный кеш — Nx Cloud.
  • Распределённое выполнение (Distributed Task Execution).

Базовый nx.json:

{
  "targetDefaults": {
    "build": {
      "dependsOn": ["^build"],
      "cache": true,
      "outputs": ["{projectRoot}/dist"]
    },
    "test": {
      "dependsOn": ["^build"],
      "cache": true
    }
  },
  "defaultBase": "main"
}

В каждом проекте — project.json со своими настройками задач. Nx сам понимает, что и как запускать.

Когда я беру Turborepo

  • Простой монорепо без сложных потребностей.
  • Команда хочет минимум вкатывания: «просто включить и работает».
  • Уже используется Vercel — интеграция с Remote Cache бесшовная.
  • Не хочется тащить в проект кодогенерацию и шаблоны.

На прошлом проекте мы выбрали Turborepo, и через две недели разработчик-новичок уже добавлял свои пакеты и запускал задачи без помощи. Конфиг — 30 строк, и больше я в него не лазил полгода.

Когда я беру Nx

  • Большой монорепо (15+ пакетов), где нужны генераторы и шаблоны.
  • Команда привыкла к Angular CLI или похожим инструментам.
  • Нужно распределённое выполнение тестов на нескольких машинах.
  • Хочется сильную интеграцию с конкретным фреймворком (особенно Angular, NestJS).

На большом проекте Nx экономит часы, потому что генератор «новый сервис» за минуту создаёт корректную структуру с тестами, dockerfile, CI-настройками. Но эта мощь требует времени на освоение — Nx CLI с десятками команд, и в начале команда теряется.

Скорость сборки

Турборепо запускает задачи быстрее «из коробки» в простых сценариях. На моём бенчмарке:

  • Холодный билд 12 пакетов: Turborepo ~36 с, Nx ~42 с.
  • Инкрементальный билд (изменён 1 пакет): Turborepo ~3.2 с, Nx ~4.1 с.
  • Из удалённого кеша: оба около 1.5-2 с.

На больших монорепо (40+ пакетов) Nx иногда выигрывает за счёт более точного анализа зависимостей. Turborepo — стабильно прост и предсказуем.

Удалённый кеш

Turborepo интегрируется с Vercel Remote Cache. Один токен — и весь CI начинает шарить кеш с локальной разработкой. Бесплатно для команды до 10 человек.

Nx Cloud работает аналогично, но имеет дополнительные функции: распределённое выполнение тестов, аналитика по задачам, agent-based execution для CI. Платная — после первых 500 минут в месяц.

Если у тебя есть бюджет и большой CI — Nx Cloud стоит своих денег за счёт распределённого выполнения. Если бюджета нет или хочется простоты — Turborepo.

Кодогенерация

У Nx есть nx generate, и это сильное преимущество. Пример:

nx generate @nx/react:library ui-button --directory=packages/ui-button
nx generate @nx/next:page user --project=web

За одну команду создаётся пакет с правильным tsconfig, тестами, ESLint, Storybook. На большом проекте это экономит дни.

В Turborepo генерации нет — ты сам копируешь шаблонный пакет или пишешь скрипт. Многие так и делают: один скрипт scripts/new-package.ts закрывает 80% потребностей.

Кривая обучения

Turborepo: за день любой разработчик понимает, как с ним работать. Концептов мало.

Nx: освоение занимает неделю-две. CLI большой, есть проектная конфигурация, генераторы, plugin-система. Новый разработчик в команде первое время ходит «спрашивать у Nx-знатока».

Совместимость

Turborepo не диктует структуру проекта. Используешь pnpm workspaces, обычные пакеты, любые сборщики — всё работает.

Nx предпочитает свою структуру (через nx init) и кладёт project.json в каждый проект. Можно использовать в standalone-режиме без структуры Nx, но многие фичи теряются.

Грабли

В Turborepo: outputs в turbo.json нужно вручную поддерживать в актуальном виде. Если задача создаёт файлы вне списка, кеш этого не учитывает. Проверяй после каждого изменения сборки.

В Nx: проектная конфигурация быстро разрастается. На крупном репо у меня было 30+ project.json с похожими настройками — пришлось писать свой migrate-скрипт. Помогает nx migrate, но не всегда покрывает custom-конфиги.

Миграция между ними

Я переезжал в обе стороны.

С Turborepo на Nx — тяжёлая миграция. Нужно перевести структуру проекта, добавить project.json, переписать команды. Заняло у меня неделю на репо из 18 пакетов.

С Nx на Turborepo — проще. Удаляешь Nx-специфичные файлы, добавляешь turbo.json, пишешь два-три скрипта замены генераторов. День-два работы.

В сухом остатке

Если ты только начинаешь — бери Turborepo. Дальше посмотришь, когда упрёшься в потолок.

Если у тебя уже большой проект и нужны генераторы, шаблоны, распределённое выполнение — Nx, и не стесняйся учить команду.

Если ты в экосистеме Vercel — Turborepo стыкуется почти бесплатно.

Если ты в Angular-экосистеме — Nx был, есть и будет лучшим выбором.

Что копать дальше

Прежде чем выбирать, подумай о CI. Скорость сборки в монорепо в первую очередь зависит от удалённого кеша. Без него и Turborepo, и Nx показывают примерно одинаковые цифры. С кешем — оба значительно ускоряются. Платный план — реальная инвестиция, которая окупается на средне-большой команде.

Комментарии 0

  • Будьте первым, кто оставит комментарий.

Войдите, чтобы оставить комментарий.