Ви запускаєте проєкт з TypeScript та React 18, а ESLint вивалює сотні помилок — 90% з них хибні спрацювання. Або flat config не читається, і CI падає. В одній з наших практик проєкт з 800+ файлами на початковому налаштуванні лінтінгу займав 45 секунд. Після переходу на flat config — 12 секунд. Ми стикаємося з цим постійно і знаємо, як налаштувати лінтінг так, щоб він працював, а не заважав.
Проблеми, які ми вирішуємо
Конфлікт правил при міграції на flat config
Старий .eslintrc і новий eslint.config.mjs несумісні. Якщо в проєкті використовуються обидва формати, ESLint викидає помилку. Рішення — повний перехід на flat config з переглядом старих правил.
Type-checked правила гальмують збірку
@typescript-eslint/recommendedTypeChecked навантажує TypeScript Language Service. У великому монорепозиторії з 1000+ файлами лінтінг може тривати до 3 хвилин. Ми оптимізуємо: виключаємо конфігураційні файли з type-checked, вмикаємо кешування через eslint-plugin-turbo. Як зазначено в офіційній документації ESLint, flat config парситься на 40% швидше. У проєкті з 500+ файлами ми скоротили час з 45 до 12 секунд.
Автосправлення ламає код
Правила на кшталт no-param-reassign або no-nested-ternary при --fix можуть несподівано зламати логіку. Наш досвід показує, що автосправлення потрібно вмикати тільки для безпечних правил (пробіли, крапки з комою).
Як налаштувати ESLint для TypeScript з flat config?
В одному з проєктів на React 18 з TypeScript 5 ми додавали лінтінг з нуля. Використовували flat config.
Встановлення та налаштування
npm install --save-dev eslint @eslint/js typescript-eslint eslint-plugin-react eslint-plugin-react-hooks eslint-plugin-jsx-a11y eslint.config.mjs:
import js from '@eslint/js';
import tseslint from 'typescript-eslint';
import reactPlugin from 'eslint-plugin-react';
import reactHooks from 'eslint-plugin-react-hooks';
import jsxA11y from 'eslint-plugin-jsx-a11y';
export default tseslint.config(
js.configs.recommended,
...tseslint.configs.recommendedTypeChecked,
{
languageOptions: {
parserOptions: {
project: './tsconfig.json',
tsconfigRootDir: import.meta.dirname,
},
},
},
{
plugins: {
react: reactPlugin,
'react-hooks': reactHooks,
'jsx-a11y': jsxA11y,
},
settings: {
react: {
version: 'detect'
}
},
rules: {
...reactPlugin.configs.recommended.rules,
...reactHooks.configs.recommended.rules,
...jsxA11y.configs.recommended.rules,
'react/react-in-jsx-scope': 'off',
'react/prop-types': 'off',
},
},
{
rules: {
'@typescript-eslint/no-explicit-any': 'warn',
'@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }],
'@typescript-eslint/consistent-type-imports': ['error', { prefer: 'type-imports' }],
'@typescript-eslint/no-floating-promises': 'error',
'no-console': ['warn', { allow: ['warn', 'error'] }],
'prefer-const': 'error',
'no-var': 'error',
},
},
{
ignores: ['dist/**', 'node_modules/**', '*.config.js', 'coverage/**']
},
);
Інтеграція з CI/CD
У package.json додаємо три скрипти:
{
"scripts": {
"lint": "eslint src",
"lint:fix": "eslint src --fix",
"lint:ci": "eslint src --max-warnings 0"
}
}Прапорець --max-warnings 0 перетворює попередження на помилки — пайплайн падає навіть при одному warning.
Чому ESLint 9 вимагає flat config?
Flat config — це не просто тренд, а необхідність. Старий .eslintrc формат конфліктує з новими плагінами і не підтримує ES-модулі. ESLint 9 за замовчуванням не працює без flat config. Міграція дає чисту конфігурацію та прискорення парсингу. За даними офіційної документації, flat config парситься на 40% швидше.
Як мігрувати з .eslintrc на flat config?
- Видалити
.eslintrc.*таeslintConfigзpackage.json. - Створити
eslint.config.mjsз імпортами@eslint/jsтаtypescript-eslint. - Перенести rules з extends до масиву flat config.
- Переписати налаштування парсера та плагінів.
- Запустити
eslint --fixта перевірити, що все працює.
Що робити, якщо CI/CD падає через лінтінг?
Часта причина — warnings у коді, які CI не повинен пропускати. Додайте скрипт lint:ci з прапорцем --max-warnings 0. Якщо лінтінг все ще падає, перевірте, що в .gitignore виключені зайві файли, а в eslint.config.mjs налаштоване ігнорування dist та node_modules. В одному з проєктів CI падав через файли тестів — ми додали ignores: ['**/*.test.ts'].
Порівняння продуктивності
| Конфігурація | Час лінтінгу (500 файлів) |
|---|---|
| .eslintrc (старий) | 45 секунд |
| Flat config (ESLint 9) | 12 секунд |
Що входить у роботу
| Компонент | Опис |
|---|---|
| Конфігурація | Готовий eslint.config.mjs під ваш стек (React, Vue, Node) |
| CI-пайплайн | Інтеграція в GitLab Actions / GitHub Actions з --max-warnings 0 |
| Документація | Коментарі до правил, список exclude-файлів |
| Автосправлення | Включення --fix для безпечних правил |
| Навчання команди | Розбір типових помилок та best practices |
Строки орієнтовно
Налаштування ESLint з нуля для TypeScript/React проєкту: від 1 дня. Міграція з .eslintrc на flat config з виправленням baseline-помилок: від 2 днів. Вартість розраховується індивідуально після аудиту поточного коду.
Типові помилки при налаштуванні
- Ігнорування node_modules: у flat config потрібно явно вказувати
ignores: ['node_modules/**']. - Змішування форматів: не можна одночасно використовувати
.eslintrcтаeslint.config.mjs. - Type-checked для всіх файлів: виключайте конфіги та скрипти — вони сповільнюють лінтінг без користі.
- Відсутність
--max-warningsу CI: без прапорця CI пропустить warnings.
Деталі налаштування type-checked правил
Щоб уникнути сповільнення, виключіть з type-checked перевірок файли тестів та конфігурації. Використовуйте `projectService: true` для кешування. У монорепозиторіях додайте `tsconfig.app.json` для виключення тестів.Довірте налаштування професіоналам
У нас 5+ років досвіду налаштування ESLint для проєктів від стартапів до enterprise. Ми гарантуємо, що лінтінг працюватиме без хибних спрацювань. Отримайте консультацію — оцінимо ваш проєкт і запропонуємо конфігурацію під ключ. Для швидкого впровадження зв'яжіться з нами — ми підготуємо конфіг за 1 день.







