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







