Что делает файл angular.json?
Файл angular.json — это основной конфигурационный файл Angular CLI, который управляет структурой проекта, настройками сборки, запуска, тестирования и деплоя. Он создается автоматически при инициализации Angular-проекта с помощью ng new и используется Angular CLI для определения параметров команд, таких как ng serve, ng build, ng test, ng lint и других.
1. Общая структура angular.json
{
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
"version": 1,
"newProjectRoot": "projects",
"projects": {
"my-app": {
...
}
},
"defaultProject": "my-app"
}
2. Ключевые поля верхнего уровня
-
$schema — путь к JSON-схеме, помогающей валидации и автодополнению.
-
version — версия схемы. Обычно 1.
-
newProjectRoot — папка по умолчанию, в которую Angular CLI будет помещать новые проекты или библиотеки (projects/).
-
projects — объект, содержащий описание всех проектов (приложений и библиотек), входящих в монорепозиторий.
-
defaultProject — имя проекта, который используется по умолчанию при выполнении CLI-команд без указания имени.
3. Раздел projects
Каждый проект (основное приложение или библиотека) описывается как объект:
"projects": {
"my-app": {
"root": "",
"sourceRoot": "src",
"projectType": "application",
"architect": { ... }
}
}
Поля внутри проекта:
-
root — корень проекта (обычно "" для основного приложения).
-
sourceRoot — путь к исходным файлам (обычно src/).
-
projectType — application или library.
-
prefix — префикс для генерации селекторов компонентов (например, app).
-
architect — набор конфигураций для задач CLI: сборка, запуск, тестирование, линтинг и т.д.
4. Раздел architect
В этом разделе задаются параметры для разных задач Angular CLI. Основные задачи:
-
build — сборка приложения
-
serve — локальный сервер (ng serve)
-
test — юнит-тестирование (ng test)
-
lint — линтинг кода (ng lint)
-
e2e — E2E-тесты (если используется)
-
extract-i18n — извлечение i18n
Пример раздела build:
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
"outputPath": "dist/my-app",
"index": "src/index.html",
"main": "src/main.ts",
"polyfills": "src/polyfills.ts",
"tsConfig": "tsconfig.app.json",
"assets": \["src/favicon.ico", "src/assets"\],
"styles": \["src/styles.css"\],
"scripts": \[\]
},
"configurations": {
"production": {
"fileReplacements": \[{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.prod.ts"
}\],
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
"extractCss": true,
"namedChunks": false,
"aot": true,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true
}
},
"defaultConfiguration": "production"
}
5. Важные параметры внутри build > options
-
outputPath — куда помещать собранный проект.
-
index — HTML-файл, используемый как шаблон.
-
main — основной файл TypeScript (точка входа).
-
polyfills — файл с полифилами.
-
tsConfig — путь к TypeScript конфигурации.
-
assets — массив файлов и папок, копируемых как есть.
-
styles — массив глобальных CSS-файлов.
-
scripts — массив JS-файлов, подключаемых глобально.
6. Конфигурации (configurations)
Позволяют определить разные режимы сборки, например:
-
production — используется при ng build --configuration production
-
development — может использоваться по умолчанию при ng serve
Здесь можно менять environment, активировать оптимизацию, отключать sourcemaps и т.д.
7. Раздел serve
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"options": {
"browserTarget": "my-app:build"
},
"configurations": {
"production": {
"browserTarget": "my-app:build:production"
}
}
}
Поле browserTarget указывает, какую сборку использовать. Можно запускать сервер с конфигурацией:
ng serve --configuration production
8. Раздел test
"test": {
"builder": "@angular-devkit/build-angular:karma",
"options": {
"main": "src/test.ts",
"polyfills": "src/polyfills.ts",
"tsConfig": "tsconfig.spec.json",
"karmaConfig": "karma.conf.js",
"assets": \["src/favicon.ico", "src/assets"\],
"styles": \["src/styles.css"\],
"scripts": \[\]
}
}
Этот блок управляет настройкой юнит-тестирования через Karma.
9. Раздел lint (устаревший в новых версиях)
До Angular 12 использовался tslint. В Angular 13+ lint может быть реализован через @angular-eslint.
Пример:
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": \["tsconfig.app.json", "tsconfig.spec.json"\],
"exclude": \["\*\*/node_modules/\*\*"\]
}
}
В новых версиях Angular рекомендуется настраивать ESLint через отдельные конфиги.
10. Поддержка нескольких проектов
Если в одном репозитории находятся несколько приложений или библиотек:
"projects": {
"app-one": { ... },
"app-two": { ... },
"shared-lib": { ... }
}
Каждое приложение/библиотека имеет свой sourceRoot, architect, tsconfig, и может запускаться отдельно.
11. Кастомные скрипты и билдеры
Можно использовать кастомные билд-сценарии и внешние билд-системы:
-
Кастомный builder
-
Интеграция с Webpack
-
Использование внешних schematics
12. Использование CLI-команд с angular.json
CLI команды используют данные из angular.json:
ng build --configuration production
ng serve --project app-two
ng test --watch
13. Поддержка i18n
Раздел extract-i18n позволяет извлекать переводимые строки:
"extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n",
"options": {
"browserTarget": "my-app:build"
}
}
14. Расширяемость
Можно вручную добавлять дополнительные конфигурации, например:
"configurations": {
"staging": {
"fileReplacements": \[
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.staging.ts"
}
\],
"optimization": true,
"sourceMap": false
}
}
angular.json — это центральная точка управления CLI-поведения Angular проекта, и его грамотная настройка позволяет создавать гибкие, масштабируемые и производственные конфигурации для любых этапов разработки.