Как Lerna стала в 10 раз быстрее

TL;DR: Мы выпустили новую бета-версию Lerna, и оказалось, что теперь она в 5,3 раза быстрее Turbo 👀… за счет включения флага. Продолжайте читать, чтобы узнать больше.

ICYMI: Пару недель назад мы (Nrwl) объявили, что берем на себя управление Lerna. Читайте об этом в нашей недавней статье в блоге.
Мы также только что выпустили Lerna v5 в качестве первого релиза технического обслуживания: Подробнее читайте здесь.

Для тех, кто хочет перейти на Nx, у нас всегда была специальная страница документации по Nx и Lerna, которая показывает, как можно легко интегрировать эти два продукта. Однако мы чувствовали, что можем сделать лучше и позволить вам получить все преимущества скорости, которые дают возможности Nx по планированию задач, без необходимости менять почти ничего в рабочем пространстве Lerna.

И это стало быстро, очень быстро!!!

Хотите видеопрохождение Lerna 5?

Вот, пожалуйста.

Насколько она быстра?

Мы только что опубликовали Lerna v5.1, в которой появился флаг useNx. Добавление этого флага делает Lerna наравне с Nx в плане скорости, и значительно быстрее других инструментов.

Сравнение Lerna с флагом и без него не совсем корректно, потому что один из них поставляется с возможностью кэширования, в то время как раньше у Lerna этого не было вообще. Но чтобы дать вам представление: включение Nx в существующее рабочее пространство Lerna может ускорить его в 2 — 10 раз, в зависимости от настроек репозитория.

Но давайте проведем более реальное сравнение скорости работы Lerna с включенным useNx. Для бенчмарков Nx мы ранее создали репо, которое мы регулярно используем для измерения скорости новых релизов Nx с другими подобными инструментами на рынке, такими как Lage и Turborepo: https://github.com/vsavkin/large-monorepo. Теперь мы добавили Lerna+Nx (Lerna с включенным useNx) в этот репо для измерения влияния.

Вот изображение выполнения бенчмарка Lerna+Nx и Turborepo:

Lerna+Nx в 5,3 раза быстрее, чем Turborepo 🚀.

Как всегда, вы можете воспроизвести бенчмарк самостоятельно, обратившись к репозиторию бенчмарка. В readme есть все подробности о том, как запустить его на своей машине. Мы подробно проверили его, но если по какой-то причине мы что-то не так поняли, пожалуйста, свяжитесь с нами!

Что мне нужно сделать для обновления?

Прежде всего, обновите Lerna до версии 5.1. В этом выпуске появилась возможность делегировать выполнение задач Nx. Далее вам нужно добавить Nx в качестве зависимости: npm i nx --save-dev.

Наконец, добавьте следующее в ваш lerna.json.

// lerna.json
{
  ...
  "useNx": true
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Вот, в основном, и все. Вы можете продолжать использовать обычные команды Lerna, но в этот момент Lerna делегирует свои операции Nx.

Чтобы получить больше пользы, вы можете создать небольшой файл nx.json (или запустить npx nx init для его создания) для более детальной настройки операций с кэшем:

// nx.json
{
  "extends": "nx/presets/npm.json",
  "tasksRunnerOptions": {
    "default": {
      "runner": "nx/tasks-runners/default",
      "options": {
        "cacheableOperations": [
          "build"
        ]
      }
    }
  }
}
Вход в полноэкранный режим Выход из полноэкранного режима

Обратите внимание, что useNx является опциональным и по умолчанию установлен в false. Также, если кто-то беспокоится о лицензии, Nx с самого начала был с открытым исходным кодом, используя лицензию MIT.

Как это работает под капотом?

Итак, как это работает на техническом уровне. До сих пор Lerna (lerna run, если быть более точным) делегировала планирование задач p-map или p-queue. Между тем, индустрия развивается, и такие инструменты, как Nx, стали гораздо мощнее и эффективнее в оркестровке задач и, кроме того, поддерживают кэширование.

С изменением, которое мы сделали в Lerna 5.1, мы добавляем Nx (с лицензией MIT) в качестве третьей опции в дополнение к уже существующим p-map и p-queue. Установив и настроив nx (как упоминалось в предыдущем разделе), Lerna теперь может передавать команду lerna run непосредственно Nx. Все это сделано с обратной совместимостью: каждая команда lerna run будет работать, но будет значительно быстрее и, по желанию, может быть даже распределена по нескольким машинам без какой-либо настройки (подробнее об этом в следующем разделе).

Более того?

Благодаря интеграции Nx вы получаете не только более быстрые сборки, но и некоторые другие возможности Nx бесплатно!

Граф проекта Nx — Выполнив команду npx nx graph, вы получите визуализацию графа. Вы можете интерактивно изучить, как выглядит ваше рабочее пространство и взаимосвязи между пакетами. Мы фактически использовали этот же график в репозитории Lerna, что помогло нам лучше понять, как структурирован репозиторий, когда мы взяли на себя его сопровождение. Вот пример фильтрации пакетов lerna, чтобы понять, что такое @lerna/exec и как он связан с другими пакетами в репозитории.

Распределенное кэширование — Сейчас, когда вы включаете useNx в существующем репозитории Lerna, вы получаете локальное кэширование, то есть кэш находится в локальной папке на вашей машине. Вы получите гораздо больше пользы, если начнете распространять и делиться им с товарищами по команде, но особенно в CI. Это можно сделать, добавив Nx Cloud, который поставляется с бесплатной кредитной картой, 500 часов бесплатно / месяц, что больше, чем нужно большинству рабочих пространств. Добавить его очень просто, для этого нужно добавить @nrwl/nx-cloud в package.json на уровне корня, а затем запустить:

npx nx connect-to-nx-cloud
Войдите в полноэкранный режим Выйти из полноэкранного режима

Распределенное выполнение задач — Распределение кэша — это одно, но реальное улучшение скорости происходит за счет распределения выполнения задач для ускорения CI. Имея граф проекта Nx, а также кэш и исторические данные о предыдущих запусках, Nx Cloud DTE способен максимизировать использование агента CI путем равномерного распределения задач на основе их (исторической) продолжительности, а также на основе их топологического порядка. Кроме того, процесс DTE обеспечивает правильное перемещение кэшированных активов между агентами. Настройка DTE проста, подробнее читайте в документации по Nx Cloud. Подсказка: у нас также есть генератор CI в Nx (вам нужен пакет @nrwl/workspace), который позволяет вам генерировать настройки CI с помощью одной команды: npx nx generate @nrwl/workspace:ci-workflow --ci=github.

Дорожная карта Lerna — Мы также только что опубликовали дорожную карту следующих шагов для репозитория Lerna. Ознакомьтесь с ней здесь: https://github.com/lerna/lerna/discussions/3140

Заключение

Это первая бета-версия, которую мы уже пробуем на некоторых проектах. Мы не беспокоимся об оркестровке задач, кэшировании или распределении — все это делает Nx, который существует уже 5 лет и является надежным. Мы пытаемся понять, есть ли что-то в интеграции, что сбивает с толку. Мы надеемся выпустить стабильную версию к середине июня.

Пожалуйста, посмотрите, обновите репо и откройте проблему, если вы столкнулись с каким-то странным поведением с включенным useNx. Но не только это, не стесняйтесь писать нам на аккаунт @NxDevTools со своими историями успеха. Мы с удовольствием послушаем 😃.


Подробнее

🧠 Lerna Docs
👩💻 Lerna GitHub
💬 Nrwl Community Slack
📹 Канал Nrwl Youtube
🧐 Нужна помощь с Angular, React, Monorepos, Lerna или Nx? Поговорите с нами 😃

Также, если вам понравилось это, нажмите ❤️ и не забудьте следить за Юри и Nx в Twitter, чтобы узнать больше!

#nx

Оцените статью
Procodings.ru
Добавить комментарий