Ограничение области проверки через --ext и паттерны

В проектах на JavaScript и TypeScript количество файлов может исчисляться тысячами. Полная проверка всей кодовой базы при каждом запуске ESLint увеличивает время анализа и нередко приводит к появлению большого количества нерелевантных предупреждений. Для управления областью проверки ESLint предоставляет несколько механизмов:

  • параметр --ext для указания расширений файлов;
  • указание директорий и файлов в командной строке;
  • использование glob-паттернов;
  • исключение файлов через .eslintignore и настройки ignores;
  • комбинирование нескольких способов фильтрации.

Грамотное ограничение области анализа позволяет существенно ускорить работу линтера и сделать процесс проверки более предсказуемым.


Параметр --ext

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

Базовый синтаксис:

eslint src --ext .js

В данном случае ESLint:

  • начинает обход из каталога src;
  • анализирует только файлы с расширением .js.

Проверка нескольких расширений

Современные проекты редко ограничиваются только JavaScript. Часто используются JSX, TypeScript и TSX.

eslint src --ext .js,.jsx,.ts,.tsx

Теперь в область проверки попадают:

  • app.js
  • Button.jsx
  • service.ts
  • Page.tsx

При обходе директорий ESLint будет игнорировать файлы других типов.


Использование --ext в TypeScript-проектах

Рассмотрим структуру:

project/
├── src/
│   ├── app.ts
│   ├── user.ts
│   └── components/
│       └── Header.tsx
└── tests/
    └── app.test.ts

Команда:

eslint . --ext .ts,.tsx

заставляет ESLint искать только TypeScript-файлы по всему проекту.

Без указания расширений некоторые файлы могут не попасть в анализ в зависимости от конфигурации и способа запуска.


Указание нескольких директорий

Проверка может быть ограничена набором каталогов.

eslint src tests --ext .js,.ts

Будут проверены только:

src/**
tests/**

Другие каталоги останутся вне области анализа.

Например:

project/
├── src/
├── tests/
├── docs/
└── scripts/

Файлы внутри docs и scripts проверяться не будут.


Проверка отдельных файлов

ESLint позволяет запускать анализ для конкретного файла.

eslint src/index.js

Или нескольких файлов:

eslint src/index.js src/utils.js

Подход часто используется:

  • в Git Hooks;
  • в CI/CD;
  • при локальной отладке ошибок линтера.

Использование glob-паттернов

Для гибкого выбора файлов применяются glob-паттерны.

Пример:

eslint "src/**/*.js"

Паттерн означает:

  • src — корневая директория поиска;
  • ** — любое количество вложенных директорий;
  • *.js — все JavaScript-файлы.

Структура:

src/
├── index.js
├── api/
│   ├── users.js
│   └── auth.js
└── ui/
    └── button.js

Будут проверены все перечисленные файлы.


Символ *

Одиночная звёздочка соответствует любому набору символов внутри одного уровня каталога.

Пример:

eslint "src/*.js"

Подходит для:

src/app.js
src/index.js
src/config.js

Не подходит для:

src/api/user.js
src/components/button.js

Поскольку вложенные директории не учитываются.


Символ **

Двойная звёздочка позволяет проходить через любое количество подкаталогов.

Пример:

eslint "src/**/*.js"

Подходит для:

src/app.js
src/api/user.js
src/api/v1/users.js
src/components/forms/login.js

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


Символ ?

Символ вопроса соответствует одному произвольному символу.

Пример:

eslint "src/file?.js"

Подходит для:

src/file1.js
src/file2.js
src/fileA.js

Не подходит:

src/file10.js
src/fileABC.js

Поскольку после слова file ожидается ровно один символ.


Группировка расширений

Glob-паттерны позволяют объединять варианты расширений.

Пример:

eslint "src/**/*.{js,jsx}"

Будут найдены:

src/app.js
src/components/Button.jsx

Аналогичный вариант для TypeScript:

eslint "src/**/*.{ts,tsx}"

Проверка нескольких групп файлов

Допускается передавать несколько шаблонов одновременно.

eslint "src/**/*.js" "tests/**/*.js"

Будут обработаны:

src/**
tests/**

Такой подход удобен, когда разные директории содержат код различного назначения.


Ограничение проверки тестами

Во многих проектах возникает необходимость анализировать только тестовые файлы.

Например:

eslint "**/*.test.js"

Будут выбраны:

user.test.js
api.test.js
auth.test.js

А обычные файлы:

user.js
api.js

в проверку не попадут.


Проверка файлов по маске имени

Возможен поиск по шаблону имени файла.

Пример:

eslint "src/**/*Service.js"

Подходит для:

UserService.js
EmailService.js
PaymentService.js

Не подходит:

UserController.js
UserRepository.js

Совместное использование --ext и glob-паттернов

Часто оба механизма применяются одновременно.

Пример:

eslint src --ext .js,.jsx

Здесь:

  1. ESLint начинает обход каталога src.
  2. Находит все вложенные файлы.
  3. Анализирует только расширения .js и .jsx.

Другой вариант:

eslint "src/**/*" --ext .ts,.tsx

Линтер перебирает все найденные файлы и оставляет только TypeScript-расширения.


Использование кавычек вокруг паттернов

Рекомендуется заключать glob-паттерны в кавычки.

Правильно:

eslint "src/**/*.js"

Нежелательно:

eslint src/**/*.js

Причина заключается в том, что разные оболочки операционной системы по-разному обрабатывают шаблоны. Кавычки позволяют передать паттерн непосредственно ESLint без предварительного раскрытия оболочкой.


Исключение файлов через .eslintignore

Даже если файл подходит под указанный паттерн, он может быть исключён.

Пример файла .eslintignore:

node_modules/
dist/
coverage/

Команда:

eslint "src/**/*.js"

не будет анализировать:

dist/app.js
coverage/report.js

если они попадают под правила игнорирования.


Исключение через ignores в Flat Config

В современных конфигурациях ESLint используется свойство ignores.

Пример:

export default [
  {
    ignores: [
      "dist/**",
      "coverage/**"
    ]
  }
];

Даже при запуске:

eslint .

содержимое указанных директорий будет исключено из анализа.


Приоритет поиска и фильтрации

Упрощённая последовательность работы ESLint выглядит следующим образом:

  1. Получение путей из командной строки.
  2. Раскрытие glob-паттернов.
  3. Фильтрация по расширениям через --ext.
  4. Применение правил игнорирования.
  5. Анализ оставшихся файлов.

Например:

eslint "src/**/*" --ext .js,.ts

При структуре:

src/
├── app.js
├── service.ts
├── styles.css
└── image.png

В итоговый список попадут только:

app.js
service.ts

Использование в npm-скриптах

Часто область проверки фиксируется в package.json.

Пример:

{
  "scripts": {
    "lint": "eslint src --ext .js,.jsx",
    "lint:ts": "eslint src --ext .ts,.tsx"
  }
}

Или через шаблоны:

{
  "scripts": {
    "lint": "eslint \"src/**/*.{js,jsx}\""
  }
}

Такой подход обеспечивает единообразный запуск линтера для всех участников проекта.


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

В монорепозитории может присутствовать несколько независимых пакетов.

Структура:

packages/
├── frontend/
├── backend/
└── shared/

Проверка только фронтенда:

eslint "packages/frontend/**/*.{js,jsx,ts,tsx}"

Проверка только бэкенда:

eslint "packages/backend/**/*.ts"

Подобное разделение позволяет уменьшить время выполнения линтера и запускать проверки независимо друг от друга.


Типичные ошибки

Отсутствие кавычек вокруг шаблона

eslint src/**/*.js

Поведение может различаться между Bash, Zsh, PowerShell и другими оболочками.

Корректнее:

eslint "src/**/*.js"

Неверное расширение

eslint src --ext js

Следует использовать точку:

eslint src --ext .js

Слишком широкий диапазон проверки

eslint .

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

Часто предпочтительнее:

eslint src tests --ext .js,.ts

Ошибки в glob-паттернах

Пример:

eslint "src/**.js"

Ожидаемый рекурсивный поиск работать не будет.

Правильный вариант:

eslint "src/**/*.js"

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

Только JavaScript-код приложения

eslint src --ext .js

JavaScript и JSX

eslint src --ext .js,.jsx

TypeScript-проект

eslint src --ext .ts,.tsx

Проверка только тестов

eslint "tests/**/*.test.js"

Проверка нескольких каталогов

eslint src tests scripts --ext .js,.ts

Проверка файлов определённого типа во всём проекте

eslint "**/*.ts"

Проверка React-проекта

eslint "src/**/*.{js,jsx}"

Проверка монорепозитория

eslint "packages/**/*.{js,ts,jsx,tsx}"

Комбинирование параметра --ext, точечного указания директорий и glob-паттернов образует основной механизм управления областью проверки в ESLint. Благодаря этим инструментам можно точно определить набор анализируемых файлов, сократить время выполнения линтера и исключить попадание в проверку служебных, сгенерированных или нерелевантных ресурсов проекта.