ESLint применяется как статический анализатор кода, обеспечивающий контроль качества JavaScript и TypeScript на этапе разработки. В Angular-экосистеме он заменил TSLint и стал стандартом де-факто для проверки корректности компонентов, сервисов, модулей и шаблонов.
Ключевая ценность ESLint в Angular заключается в объединении анализа TypeScript-кода и HTML-шаблонов компонентов в единую систему правил. Это позволяет выявлять ошибки структуры приложения, нарушения архитектурных соглашений и потенциальные проблемы производительности до запуска сборки.
Интеграция ESLint с Angular реализуется через набор пакетов
@angular-eslint. Он обеспечивает поддержку специфики
фреймворка: декораторов, DI-контейнера, шаблонов и lifecycle hooks.
Основные пакеты:
@angular-eslint/eslint-plugin — набор правил для
Angular-кода@angular-eslint/eslint-plugin-template — анализ
HTML-шаблонов@angular-eslint/template-parser — парсер Angular
templates@angular-eslint/schematics — автоматическая миграция и
настройка@angular-eslint/builder — интеграция с Angular CLIЭти компоненты формируют связку, позволяющую ESLint работать не только с TypeScript, но и с template-driven частью приложения.
Исторически Angular использовал TSLint, однако его развитие прекращено. Переход на ESLint выполняется через schematics:
ng add @angular-eslint/schematics
В процессе миграции:
tslint.json.eslintrc.json или
eslint.config.*angular.json@angular-eslintАвтоматизация снижает количество ручных правок, но требует проверки совместимости кастомных правил, особенно в больших проектах.
Классическая конфигурация Angular-проекта строится на JSON-файле:
{
"root": true,
"overrides": [
{
"files": ["*.ts"],
"extends": [
"plugin:@angular-eslint/recommended",
"plugin:@typescript-eslint/recommended"
],
"parserOptions": {
"project": ["tsconfig.json"]
},
"rules": {}
},
{
"files": ["*.html"],
"extends": [
"plugin:@angular-eslint/template/recommended"
],
"rules": {}
}
]
}
Архитектура конфигурации основана на разделении контекстов:
Такой подход позволяет применять разные наборы правил к разным частям проекта.
Современная версия ESLint поддерживает flat config
(eslint.config.js), где исключается наследование через
extends в пользу явной композиции:
import tseslint from "typescript-eslint";
import angular from "@angular-eslint/eslint-plugin";
export default [
...tseslint.configs.recommended,
{
files: ["**/*.ts"],
plugins: {
"@angular-eslint": angular
},
rules: {
"@angular-eslint/directive-selector": "error"
}
}
];
Flat config уменьшает сложность цепочек наследования и упрощает анализ источника правил.
Интеграция с TypeScript осуществляется через
@typescript-eslint/parser и соответствующий plugin.
Ключевые аспекты:
parserOptions.project для анализа
типовtsconfig.jsonngOnInit)Типичные правила:
Особое значение имеет согласованность между ESLint и TypeScript compiler options, так как расхождение приводит к дублированию или пропуску ошибок.
HTML-шаблоны в Angular представляют отдельную зону анализа. Для этого
используется @angular-eslint/template-parser.
Шаблонный анализ включает:
*ngIf,
*ngFor)Пример конфигурации:
{
"files": ["*.html"],
"extends": ["plugin:@angular-eslint/template/recommended"],
"rules": {
"@angular-eslint/template/no-negated-async": "error"
}
}
Особое внимание уделяется выражениям внутри шаблонов, так как они выполняются в runtime и могут создавать скрытые ошибки.
Angular ESLint включает правила, направленные на соблюдение архитектурных соглашений:
Пример правила:
@angular-eslint/component-selector@angular-eslint/directive-selectorОни обеспечивают единообразие структуры проекта:
@Component({
selector: 'app-user-card'
})
Нарушения naming convention выявляются до этапа сборки, предотвращая фрагментацию кодовой базы.
В крупных Angular-приложениях важно контролировать зависимость между слоями:
ESLint используется совместно с плагинами для архитектурных ограничений:
Дополнительно применяются правила import/no-cycle и
boundaries.
Angular CLI поддерживает ESLint через builder:
"lint": {
"builder": "@angular-eslint/builder:lint",
"options": {
"lintFilePatterns": ["src/**/*.ts", "src/**/*.html"]
}
}
Запуск анализа:
ng lint
CLI обеспечивает унифицированный запуск анализа в рамках проекта, включая CI-сценарии.
ESLint часто интегрируется в pipeline:
Типовой сценарий:
npm run lint
При наличии ошибок сборка блокируется. Это позволяет:
Для локального контроля используется Husky и lint-staged:
{
"lint-staged": {
"*.ts": "eslint --fix",
"*.html": "eslint"
}
}
Такой механизм снижает нагрузку на CI и переносит часть проверки на этап коммита.
В экосистеме Nx ESLint используется как основной инструмент анализа границ модулей.
Особенности:
Правило boundaries позволяет ограничивать импорт между библиотеками:
"@nx/enforce-module-boundaries": [
"error",
{
"depConstraints": [
{
"sourceTag": "feature",
"onlyDependOnLibsWithTags": ["shared", "core"]
}
]
}
]
При увеличении размера Angular-проекта ESLint может становиться узким местом. Основные факторы влияния:
Оптимизация включает:
--cache)ESLint позволяет создавать собственные правила для Angular-проектов:
module.exports = {
create(context) {
return {
"ClassDeclaration"(node) {
if (!node.decorators) {
context.report({
node,
message: "Component requires decorator"
});
}
}
};
}
};
В Angular контексте такие правила используются для:
ESLint в Angular применяется не только для стиля, но и для предотвращения runtime-ошибок:
Особое значение имеет сочетание ESLint с strict TypeScript mode, что формирует многоуровневую систему защиты.
Помимо @angular-eslint, используются дополнительные
плагины:
eslint-plugin-importeslint-plugin-rxjseslint-plugin-jsdoceslint-plugin-unicornВ Angular проектах особенно важен rxjs-анализ:
В корпоративных Angular-проектах ESLint становится инструментом стандартизации:
--fix)Комбинация CLI, CI и pre-commit hooks формирует многоуровневую систему контроля качества кода.