Ви запускаєте проєкт з 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 день.







