Ускорьте рабочее пространство Yarn с помощью Nx

Если у вас есть рабочее пространство Yarn, вы можете превратить его в монорепо Nx с помощью простой команды. Ниже приведен пример рабочего пространства Yarn с несколькими приложениями Expo, которое мы будем использовать для добавления Nx:
https://github.com/byCedric/eas-monorepo-example

В этом примере рабочего пространства есть 3 приложения Expo:

  • managed: Expo managed app
  • выброшенный: Expo bare app
  • with-sentry: Expo managed app со встроенным sentry-expo.

Когда вы запустите приложение, у каждого приложения будет просто текст в середине экрана:

В этом блоге мы покажем вам, как превратить вышеупомянутое рабочее пространство Yarn в Nx.


Почему Nx?

Прежде чем мы начнем, первый вопрос, который мы должны решить: зачем проходить через все трудности, чтобы превратить рабочее пространство Yarn в Nx? Если у вас есть рабочее пространство Yarn, вы уже можете обмениваться кодом между приложениями. Так зачем же тогда Nx?

Как и Yarn workspace, Nx — это инструмент monorepo. Однако, в отличие от Yarn workspace, Nx не только обеспечивает более быстрое время сборки и лучший опыт разработчика, но и предоставляет:

  • Визуализации рабочего пространства
  • Распределенное выполнение задач
  • Легкое обновление
  • Плагин редактора

Шаги

После проверки репо, перейдите в папку и запустите:

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

В терминале вы должны увидеть следующее:

>  NX  🐳 Nx initialization
? Use Nx Cloud? (It's free and doesn't require registration.) Yes [Faster builds, run detail
s, Github integration. Learn more at https://nx.app]
>  NX  🧑‍🔧 Analyzing the source code and creating configuration files
>  NX  📦 Installing dependencies
Войти в полноэкранный режим Выйти из полноэкранного режима

Вы должны увидеть, что файл с именем nx.json создан в корне вашего рабочего пространства.

Обратите внимание в package.json: вы должны увидеть, что последняя версия nx добавлена в devDependencies, как показано ниже:

"devDependencies": {
  "nx": "14.1.6"
}
Вход в полноэкранный режим Выйти из полноэкранного режима

Вот и все! Теперь вы официально добавили Nx в свое рабочее пространство.


Более быстрая сборка

В рабочем пространстве Yarn, если вы запустите yarn build, он выполнит команду сборки для каждого приложения и библиотеки. Для приведенного ниже примера это заняло 5,51 секунды:

$ yarn workspaces run build
> @acme/app-ejected
$ echo 'Nothing to build'
Nothing to build
> @acme/app-managed
$ echo 'Nothing to build'
Nothing to build
> @acme/app-with-dev-client
$ echo 'Nothing to build'
Nothing to build
> @acme/app-with-sentry
$ echo 'Nothing to build'
Nothing to build
> @acme/babel-preset-expo
$ echo 'Nothing to build'
Nothing to build
> @acme/eslint-config
$ echo 'Nothing to build'
Nothing to build
> @acme/ui
$ bob build
ℹ Building target commonjs
ℹ Cleaning up previous build at build/commonjs
ℹ Compiling 1 files in src with babel
✔ Wrote files to build/commonjs
ℹ Building target module
ℹ Cleaning up previous build at build/module
ℹ Compiling 1 files in src with babel
✔ Wrote files to build/module
ℹ Building target typescript
ℹ Cleaning up previous build at build/typescript
ℹ Generating type definitions with tsc
✔ Wrote definition files to build/typescript
✨  Done in 5.51s.
Вход в полноэкранный режим Выход из полноэкранного режима

Однако, переключив рабочее пространство в режим Nx, запустите команду сборки для всех приложений и библиотек:

yarn nx run-many --target=build --all
Войти в полноэкранный режим Выйти из полноэкранного режима

Обратите внимание, что второй запуск займет гораздо меньше времени. Например, для приведенного ниже примера это заняло всего 0,96 секунды:

То же самое относится и к линтингу. Если вы запустите yarn test, обратите внимание, что он запустит линтинг для каждого приложения и библиотеки (в этом репозитории он использует тестовый скрипт для запуска eslint). Для приведенного ниже примера это заняло 18,26 секунды.

yarn run v1.22.10
$ yarn workspaces run test
> @acme/app-ejected
$ eslint --ext js,ts,tsx .
> @acme/app-managed
$ eslint --ext js,ts,tsx .
> @acme/app-with-dev-client
$ eslint --ext js,ts,tsx .
> @acme/app-with-sentry
$ eslint --ext js,ts,tsx .
> @acme/babel-preset-expo
$ echo 'Nothing to test'
Nothing to test
> @acme/eslint-config
$ echo 'Nothing to test'
Nothing to test
> @acme/ui
$ eslint --ext ts,tsx ./src
✨  Done in 18.26s.
Вход в полноэкранный режим Выход из полноэкранного режима

Чтобы запустить тестовую команду для всех приложений и библиотек:

yarn nx run-many --target=test --all
Войти в полноэкранный режим Выйти из полноэкранного режима

Обратите внимание, что для приведенного ниже примера это заняло всего 0,95 секунды:

Для этого репозитория он фактически сократил время сборки и работы lint на ~90%. Как Nx добился этого?

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

Визуализации рабочего пространства и правила границ

Чтобы увидеть график проекта рабочего пространства, выполните команду:

yarn nx graph
Войти в полноэкранный режим Выйти из полноэкранного режима

Вы должны увидеть приведенный ниже график:

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

Итак, это относительно небольшое рабочее пространство, содержащее всего 3 библиотеки и 4 приложения. По мере роста рабочего пространства становится все сложнее укрощать зависимости и импорт между библиотеками. Вы определенно не хотите, чтобы ваше монорепо превратилось в большой запутанный беспорядок. Кроме того, отслеживание круговых зависимостей в большом репозитории может быстро превратиться в головную боль, если вашим единственным инструментом является изучение кода.

В дополнение к использованию графа проекта Nx также поставляется с правилом lint @nrwl/nx/enforce-module-boundaries для раннего обнаружения круговых зависимостей и предотвращения импорта между библиотеками, которые не должны взаимодействовать друг с другом. Подробнее читайте в статье нашего блога «Укрощение организации кода с помощью границ модулей в Nx».

Распределенное выполнение задач

Nx также поставляется с командой affected: вместо того, чтобы выполнять команду для всех приложений и библиотек, она будет выполнять команду только для тех, на которые «повлияло» изменение.

Например, если вы не внесли никаких изменений в код и выполнили команду:

yarn nx affected --target=build
Войти в полноэкранный режим Выйти из полноэкранного режима

То сборка не будет запущена ни для одного проекта:

Если вместо этого вы изменили библиотеку ui в этой рабочей области, то приложения, которые зависят от этой библиотеки, будут затронуты (apps-ejected, app-managed, app-with-dev-client, app-with-sentry); библиотека babel-preset-expo и eslint-config не будут затронуты.

Если вы выполните команду yarn nx affected:graph, вы должны увидеть график зависимостей:

Теперь выполните команду yarn nx affected --target=build:

Заметьте в консоли, babel-preset-expo и eslint-config извлечены из кэша; библиотека ui и все приложения пересобраны.

Если вы изменили только управляемое приложение, другие приложения не будут затронуты. Граф зависимостей должен выглядеть так, как показано ниже, только с app-managed:

Теперь запустите команду снова:

Обратите внимание, что она собирает только app-managed.

Команда affected — это мощный инструмент, который еще больше сокращает время сборки, тестирования и линтинга.

Простое обновление

Еще одна мощная команда Nx — migrate.

Выполнив команду yarn nx migrate latest, вы автоматически обновите все фреймворки и инструменты до последних версий. Например, для рабочего пространства Expo, если вы хотите обновить версию Expo, вам может понадобиться обновить версии React Native, React и других библиотек. Вы можете зайти в свой package.json и попытаться изменить номер версии вручную, а можете предоставить Nx обновить версию за вас. Nx не только обновит номера версий, но и выполнит миграцию кода и конфигурации, если это необходимо.

Плагины редактора Nx

Nx также предлагает мощные плагины редактора для улучшения работы разработчика. Например. вы можете использовать Nx Console для VS Code. Тогда добавление другого приложения Expo в это рабочее пространство будет одним кликом:


Заключение

Это некоторые из возможностей, которые Nx может предложить по сравнению с Yarn Workspace.

Надеюсь, после прочтения этого блога я убедил вас перевести ваше рабочее пространство Yarn в Nx или, по крайней мере, захотеть попробовать Nx. Если нет, вы можете прочитать больше:

  • Добавление Nx в рабочее пространство Lerna/Yarn/PNPM/NPM
  • От Lerna/Yarn к Nx: Ускоренное время сборки и лучшая эргономика для разработчиков

Куда двигаться дальше?

  • присоединяйтесь к сообществу Slack
  • следите за Nx в Twitter
  • узнайте больше о Nx на https://nx.dev
  • подписывайтесь на канал Nx на Youtube

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