Как использовать монорепозитории с Nx или Lerna в Angular?


Использование монорепозитория с инструментами вроде Nx или Lerna в Angular-проектах позволяет управлять большим количеством приложений и библиотек в одном репозитории, улучшая повторное использование кода, стандарты, масштабируемость и производительность CI/CD. Nx и Lerna преследуют схожие цели, но различаются в реализации и уровне поддержки Angular.

1. Что такое монорепозиторий

Монорепозиторий — это структура, где несколько приложений и библиотек живут в одном репозитории с общими зависимостями, конфигурациями и инструментами сборки.

2. Почему Nx лучше подходит для Angular

Nx — это инструмент от команды Nrwl, созданный бывшими разработчиками Angular, и тесно интегрирован с Angular CLI. Он предоставляет:

  • Поддержку Angular "из коробки";

  • Генераторы (схематики), поддерживающие Angular, NestJS, React и др.;

  • Интеграцию с Jest, Cypress, ESLint, Prettier;

  • Кеширование сборок и анализ зависимостей;

  • Рефакторинг и линтинг на уровне графа зависимостей.

3. Установка Nx и создание Angular-монорепозитория

npx create-nx-workspace@latest

Вопросы CLI:

  • Workspace name: my-workspace

  • What to create: apps and libs

  • Default app: my-app

  • Framework: Angular

После генерации структура будет следующей:

my-workspace/
├── apps/
 ├── my-app/
 └── admin-app/
├── libs/
 ├── ui/
 ├── auth/
 └── shared/
├── nx.json
├── angular.json
├── workspace.json (или project.json)
├── tsconfig.base.json
├── package.json
  • apps/ — отдельные приложения (SPA, SSR, PWA);

  • libs/ — переиспользуемые библиотеки (компоненты, сервисы, модели);

  • nx.json, angular.json — глобальная конфигурация;

  • workspace.json — настройка проектов и их таргетов.

4. Создание библиотек и приложений

nx g @nrwl/angular:app admin-panel
nx g @nrwl/angular:lib auth
nx g @nrwl/angular:lib ui --directory=components

Nx регистрирует каждый проект как отдельную сущность, с изолированным tsconfig, eslint, jest и другими настройками.

5. Импорт библиотек через алиасы

Каждая библиотека получает свой alias:

import { LoginComponent } from '@my-workspace/auth';
import { ButtonComponent } from '@my-workspace/ui/components';

Все алиасы настраиваются в tsconfig.base.json.

6. Ограничение зависимостей между модулями

Файл nx.json и tslint.json (или eslint) позволяет запрещать/разрешать импорт библиотек между доменами:

"dependencyConstraints": \[
{
"sourceTag": "scope:auth",
"onlyDependOnLibsWithTags": \["scope:shared", "scope:core"\]
}
\]

Это помогает изолировать домены и соблюдать архитектуру.

7. Инструменты и команды Nx

  • nx build <project> — сборка проекта.

  • nx serve <project> — запуск dev-сервера.

  • nx test <project> — юнит-тесты (Jest).

  • nx e2e <project> — e2e тесты (Cypress).

  • nx lint <project> — линтинг.

Дополнительно:

  • nx graph — визуализация графа зависимостей;

  • nx affected:apps — показать приложения, затронутые изменениями;

  • nx format:write — автоформатирование;

  • nx run-many — запустить команды сразу на нескольких проектах.

8. Кеширование и ускорение CI

Nx использует Distributed Task Execution (DTE) и кеширует результаты сборки/тестов. Это сокращает время CI на десятки минут.

nx affected:build --base=main

Nx кеширует каждый шаг и повторно использует результаты при тех же входных данных.

9. Поддержка NestJS, React и других фреймворков

Nx может использоваться не только для Angular, но и для:

  • Backend (NestJS, Express);

  • Mobile (Ionic, React Native);

  • Web (React, Next.js, Vue);

  • PWA/SSR.

Это позволяет объединить фронтенд и бэкенд в одном репозитории с единым CI/CD и зависимостями.

10. Отличие Nx от Lerna

Характеристика Nx Lerna
Поддержка Angular Отличная (официальная) Ограниченная
--- --- ---
Dependency Graph Да Нет
--- --- ---
Кеширование задач Да (out-of-the-box) Через доп. инструменты
--- --- ---
Интеграция CLI Да (nx g, nx run) Нет
--- --- ---
Преимущества CI Affected commands Частично через Yarn/NPM
--- --- ---
Интеграция Jest, ESLint, Cypress Встроенная Вручную
--- --- ---

Lerna хорошо справляется с управлением npm-пакетами и публикацией в NPM, особенно в сочетании с Yarn Workspaces. Однако для Angular предпочтительнее использовать Nx из-за его полной поддержки CLI, Angular архитектуры и оптимизации сборки.

11. Публикация библиотек

Nx позволяет использовать библиотеки как локальные, так и публикуемые:

  • Через ng-packagr можно подготовить Angular library (buildable).

  • Можно использовать npm publish для публикации dist/libs/my-lib.

Для этого создаются библиотеки с опцией --buildable:

nx g @nrwl/angular:lib my-lib --buildable

12. Настройка CI/CD

В CI скриптах используются affected-команды:

nx affected:lint --base=origin/main
nx affected:test --base=origin/main
nx affected:build --base=origin/main

Только те приложения и библиотеки, которые были изменены, будут пересобраны и протестированы.

13. Интеграция с Storybook

Nx поддерживает генерацию и автоматическую настройку Storybook:

nx g @nrwl/angular:storybook-configuration ui

Можно запускать nx storybook ui и документировать компоненты в рамках библиотеки.

14. Конфигурация на проект

Каждое приложение и библиотека имеют свой project.json, что позволяет:

  • изолировать настройки;

  • настраивать разные таргеты (build, serve, test, lint);

  • назначать executor (например, @nrwl/angular:webpack-browser или custom-scripts).

Использование Nx позволяет выстроить масштабируемую, модульную, типизированную и производительную архитектуру Angular-приложения, оптимизируя DevOps, производительность и стандарты разработки.