Пакет @angular-eslint представляет собой набор инструментов и плагинов, обеспечивающих полноценную интеграцию ESLint в экосистему Angular. Он заменяет устаревший подход с TSLint и предоставляет единый механизм анализа TypeScript-кода, шаблонов Angular и конфигураций проектов.
Ключевая особенность архитектуры заключается в разделении ответственности между несколькими пакетами:
Такое разделение позволяет независимо анализировать TypeScript и
шаблоны, что критично для Angular, где логика распределена между
.ts и .html.
Интеграция начинается с установки основных пакетов:
ng add @angular-eslint/schematics
Эта команда автоматически:
В случае ручной установки добавляются зависимости:
npm install --save-dev eslint @angular-eslint/eslint-plugin @angular-eslint/eslint-plugin-template @angular-eslint/template-parser
Основной файл конфигурации обычно представлен как
.eslintrc.json:
{
"root": true,
"ignorePatterns": ["projects/**/*"],
"overrides": [
{
"files": ["*.ts"],
"parser": "@typescript-eslint/parser",
"parserOptions": {
"project": ["tsconfig.json"],
"createDefaultProgram": true
},
"plugins": ["@angular-eslint"],
"extends": [
"plugin:@angular-eslint/recommended",
"plugin:@angular-eslint/template/process-inline-templates"
],
"rules": {
"@angular-eslint/directive-selector": [
"error",
{
"type": "attribute",
"prefix": "app",
"style": "camelCase"
}
],
"@angular-eslint/component-selector": [
"error",
{
"type": "element",
"prefix": "app",
"style": "kebab-case"
}
]
}
},
{
"files": ["*.html"],
"extends": ["plugin:@angular-eslint/template/recommended"],
"rules": {}
}
]
}
Эти правила обеспечивают единообразие структуры Angular-приложения.
@angular-eslint/component-class-suffix — проверяет
суффикс классов компонентов@angular-eslint/directive-class-suffix — проверяет
директивы@angular-eslint/no-input-rename — запрещает скрытое
переименование входных свойств@angular-eslint/no-output-rename — контролирует
переименование событийОсобое внимание уделяется читаемости API компонентов, что критично для масштабируемых систем.
Селекторы являются ключевой частью архитектуры Angular.
"@angular-eslint/directive-selector": [
"error",
{
"type": "attribute",
"prefix": "app",
"style": "camelCase"
}
]
Контроль селекторов предотвращает:
Плагин @angular-eslint/eslint-plugin-template анализирует HTML-шаблоны:
@angular-eslint/template/no-negated-async —
предотвращает сложные отрицания с async pipe@angular-eslint/template/banana-in-box — проверяет
корректность [(ngModel)]@angular-eslint/template/no-call-expression — запрещает
вызовы функций в шаблонах@angular-eslint/template/accessibility-alt-text —
проверяет наличие alt у изображенийПример нарушения:
<div>{{ getUser().name }}</div>
Такой код приводит к частым перерендерингам и ухудшению производительности.
Для анализа HTML используется специализированный парсер:
"parser": "@angular-eslint/template-parser"
Он позволяет ESLint понимать Angular-синтаксис:
*ngIf, *ngFor[property](click)[(...)]Без этого парсера стандартный ESLint не способен корректно интерпретировать Angular-шаблоны.
@angular-eslint интегрируется в Angular CLI через builder:
"lint": {
"builder": "@angular-eslint/builder:lint",
"options": {
"lintFilePatterns": ["src/**/*.ts", "src/**/*.html"]
}
}
Запуск анализа:
ng lint
Это позволяет:
Исторически Angular использовал TSLint, но он был официально deprecated. @angular-eslint предоставляет инструменты миграции:
ng g @angular-eslint/schematics:convert-tslint-to-eslint
Миграция включает:
Современные версии ESLint поддерживают flat config
(eslint.config.js). @angular-eslint постепенно
адаптируется к этой модели.
Пример:
import angular from '@angular-eslint/eslint-plugin';
export default [
{
files: ['**/*.ts'],
languageOptions: {
parser: require('@typescript-eslint/parser')
},
plugins: {
'@angular-eslint': angular
},
rules: {
'@angular-eslint/directive-selector': 'error'
}
}
];
Flat config упрощает:
При больших Angular-приложениях ESLint может замедляться из-за анализа TypeScript project references. @angular-eslint учитывает это через:
createDefaultProgram: true (fallback режим)node_modules и build artifactsОптимизация особенно важна в монорепозиториях Nx.
В экосистеме Nx @angular-eslint используется как стандартный линтер:
"lint": {
"executor": "@nx/eslint:lint",
"options": {
"lintFilePatterns": ["apps/**/*.{ts,html}"]
}
}
Nx добавляет:
@angular-eslint позволяет реализовывать архитектурные ограничения:
anyПример кастомного правила:
"rules": {
"no-restricted-imports": [
"error",
{
"patterns": ["../shared/*"]
}
]
}
Создание собственных правил выполняется через ESLint Rule API:
Пример концепции правила:
documentRenderer2Часто встречающиеся проблемы:
template-parser → шаблоны не
анализируютсяparserOptions.project → ошибки типов.ts и
.htmlВ масштабных Angular-приложениях @angular-eslint становится частью архитектурного слоя качества кода:
Постепенное усложнение правил позволяет переходить от базовой проверки синтаксиса к полноценной статической архитектурной валидации проекта.