ESLint в проектах на React

В экосистеме React качество кода напрямую влияет на стабильность компонентов, предсказуемость состояния и масштабируемость интерфейса. В условиях частых изменений состояния, сложной композиции компонентов и активного использования хуков контроль стилистики и корректности кода становится критическим. Эту задачу решает ESLint — инструмент статического анализа, выявляющий ошибки до выполнения кода.

ESLint работает на уровне AST (Abstract Syntax Tree), анализируя структуру JavaScript-кода и применяя набор правил, которые описывают корректное или нежелательное поведение. В React-проектах ESLint выходит за рамки базовой проверки синтаксиса и становится системой контроля архитектурных соглашений.


Архитектура ESLint в React-проектах

В React-приложениях ESLint обычно состоит из нескольких слоёв:

  • ядро ESLint — интерпретирует код и применяет правила
  • парсер (чаще всего @babel/eslint-parser или @typescript-eslint/parser)
  • плагины React — расширяют правила под JSX и хуки
  • конфигурации — наборы готовых правил
  • интеграции с форматтерами (Prettier и аналоги)

Ключевая особенность React-контекста заключается в необходимости понимания JSX-синтаксиса и жизненного цикла компонентов, что требует дополнительных плагинов.


Базовая настройка ESLint для React

Типичная конфигурация начинается с установки ядра и React-плагинов:

  • eslint
  • eslint-plugin-react
  • eslint-plugin-react-hooks
  • eslint-plugin-jsx-a11y

Основная конфигурация описывает:

  • среду выполнения (browser, es2021)
  • поддержку JSX
  • расширение стандартных наборов правил

Пример логики конфигурации:

  • включение правил React
  • включение правил хуков
  • проверка доступности интерфейса

JSX и особенности анализа

JSX представляет собой синтаксическое расширение JavaScript, которое преобразуется в вызовы React.createElement или аналогичные функции. ESLint обрабатывает JSX через специализированные парсеры.

Основные аспекты анализа JSX:

  • корректность вложенности элементов
  • использование ключей в списках
  • проверка валидности пропсов
  • контроль условного рендеринга

Особое внимание уделяется:

  • key в списках
  • запрещённым HTML-атрибутам в JSX
  • корректному использованию self-closing тегов

React Hooks и строгие правила анализа

Плагин eslint-plugin-react-hooks вводит критически важные ограничения, основанные на модели хуков:

  • хуки вызываются только на верхнем уровне компонента
  • хуки не вызываются внутри условий и циклов
  • зависимости эффектов должны быть полными

Ключевые правила:

  • rules-of-hooks — предотвращает нарушение порядка вызова хуков
  • exhaustive-deps — контролирует зависимости useEffect, useMemo, useCallback

Анализ хуков основан не на синтаксисе, а на семантике вызовов функций, что делает ESLint особенно важным инструментом предотвращения скрытых ошибок состояния.


Доступность интерфейса (a11y)

Плагин eslint-plugin-jsx-a11y проверяет соответствие интерфейса базовым требованиям доступности.

Основные проверки:

  • наличие alt у изображений
  • корректные ARIA-атрибуты
  • использование семантических элементов
  • контроль tabindex и фокуса

В React-проектах это особенно важно из-за активного использования кастомных компонентов вместо стандартных HTML-элементов.


Импорты и архитектура модулей

ESLint часто дополняется eslint-plugin-import, который анализирует структуру модулей:

  • корректность путей импорта
  • отсутствие циклических зависимостей
  • порядок импортов
  • наличие неиспользуемых зависимостей

В React-приложениях это влияет на:

  • структуру feature-based архитектуры
  • разделение компонентов и утилит
  • предотвращение «монолитных» файлов

Типовые конфигурации ESLint в React

Create React App

В стандартной конфигурации CRA ESLint уже встроен. Он включает:

  • базовые правила JavaScript
  • React-правила
  • предупреждения о потенциальных ошибках

Ограничение подхода — невозможность глубокой кастомизации без eject или override-конфигураций.


Vite-проекты

В проектах на Vite ESLint подключается вручную:

  • гибкая структура конфигурации
  • использование eslint.config.js (flat config)
  • поддержка модульной архитектуры

Next.js

В React-экосистеме Next.js ESLint интегрирован на уровне фреймворка:

  • правила для серверных компонентов
  • контроль getServerSideProps / getStaticProps
  • ограничения на использование браузерных API

Flat Config и современная конфигурация ESLint

Современный ESLint переходит на flat config (eslint.config.js), где:

  • отсутствует наследование .eslintrc
  • конфигурация строится как массив объектов
  • плагины подключаются явно

Преимущества:

  • предсказуемая структура
  • отсутствие скрытых расширений
  • лучшая масштабируемость в монорепозиториях

Интеграция с TypeScript в React

При использовании TypeScript ESLint расширяется через:

  • @typescript-eslint/parser
  • @typescript-eslint/eslint-plugin

Основные аспекты проверки:

  • корректность типов props
  • проверка возвращаемых значений компонентов
  • анализ дженериков
  • контроль strict mode правил TypeScript

В React-проектах TypeScript усиливает статический анализ ESLint, превращая его в комбинированную систему типовой и синтаксической проверки.


Форматирование и конфликт с Prettier

ESLint и форматтеры часто конфликтуют из-за пересечения задач. Для устранения конфликтов используется:

  • eslint-config-prettier
  • отключение стилистических правил ESLint
  • перенос форматирования в Prettier

Разделение ответственности:

  • ESLint: логика, ошибки, архитектура
  • Prettier: стиль кода

Автоматизация исправлений

ESLint поддерживает автоисправления через --fix.

Типы исправлений:

  • удаление неиспользуемых переменных
  • упорядочивание импортов
  • исправление JSX-структуры
  • автоматическая корректировка зависимостей хуков

В React-проектах автофиксы часто интегрируются в:

  • pre-commit хуки (Husky)
  • lint-staged
  • CI pipelines

ESLint в монорепозиториях React

В монорепозиториях (Turborepo, Nx) ESLint играет роль централизованного контроллера качества:

  • единые правила для всех пакетов
  • шаринг конфигураций
  • кэширование анализа
  • изоляция контекстов React-приложений и библиотек

Особое значение имеет:

  • разделение правил для UI и бизнес-логики
  • контроль зависимостей между пакетами

Производительность анализа

При больших React-приложениях ESLint может стать узким местом.

Оптимизации:

  • включение кэширования (--cache)
  • ограничение файлов через lint-staged
  • исключение node_modules
  • использование overrides для точечной проверки

Типичные ошибки в React-проектах, выявляемые ESLint

  • отсутствие зависимостей в useEffect
  • неправильное использование ключей в списках
  • мутация состояния напрямую
  • неиспользуемые переменные и импорты
  • некорректная структура JSX
  • нарушение правил хуков

Эти ошибки часто не проявляются во время компиляции, но приводят к нестабильному поведению интерфейса.


Расширяемость через кастомные правила

ESLint позволяет создавать собственные правила для React-архитектуры:

  • запрет прямого импорта компонентов из внутренних модулей
  • контроль структуры feature folders
  • ограничение использования определённых хуков
  • проверка naming conventions

Кастомные правила пишутся как плагины и могут учитывать специфику конкретного проекта.


Роль ESLint в жизненном цикле React-приложения

На ранних этапах разработки ESLint обеспечивает:

  • базовую стабилизацию кода
  • предотвращение архитектурных ошибок

В зрелых проектах:

  • контроль масштабируемости
  • унификация командной разработки
  • снижение технического долга

В долгосрочной перспективе ESLint становится частью инфраструктуры качества кода, а не просто инструментом проверки синтаксиса.