Игнорирование файлов в flat config

Механизм игнорирования файлов в flat config ESLint основан на явном описании исключений прямо внутри конфигурационного массива, без использования отдельного .eslintignore как основного источника правил. Flat config (начиная с ESLint 9) смещает модель конфигурации в сторону декларативного списка объектов, где каждая часть конфигурации может содержать собственные правила включения и исключения.

Базовая концепция ignores в flat config

В flat config игнорирование файлов реализуется через поле ignores. Оно задаётся в конфигурационных объектах и принимает массив строковых шаблонов.

export default [
  {
    ignores: ["dist/**", "node_modules/**"]
  },
  {
    files: ["src/**/*.js"],
    rules: {
      semi: ["error", "always"]
    }
  }
];

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

Поведение ignores в цепочке конфигураций

Flat config представляет собой упорядоченный массив объектов. Каждый объект влияет на итоговую конфигурацию, но ignores работает глобально по принципу фильтрации входного набора файлов.

Если файл совпадает с любым из паттернов ignores, он исключается из дальнейшей обработки, независимо от того, какие files указаны в последующих конфигурационных объектах.

export default [
  {
    ignores: ["build/**"]
  },
  {
    files: ["build/index.js"],
    rules: {
      "no-console": "error"
    }
  }
];

В данном случае build/index.js никогда не будет проверяться, несмотря на явное совпадение с files.

Синтаксис шаблонов игнорирования

Шаблоны в ignores используют глобоподобный синтаксис, аналогичный minimatch:

  • ** — рекурсивное соответствие директорий
  • * — соответствие части имени файла
  • ! — отрицание шаблона (в зависимости от контекста конфигурации)
  • относительные пути интерпретируются от корня проекта

Примеры:

ignores: [
  "**/*.min.js",
  "coverage/**",
  "dist/**/*.map",
  "temp-*"
]

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

Отличие ignores от .eslintignore

В традиционной конфигурации ESLint использовался файл .eslintignore. В flat config он считается устаревшим механизмом и не является основным источником игнорирования.

Основные различия:

  • .eslintignore — внешний файл, не связанный с конфигурационным массивом
  • ignores — часть JavaScript-конфигурации
  • порядок и приоритет полностью управляются конфигом
  • возможность локального и контекстного игнорирования внутри массива конфигураций

В flat config игнорирование становится частью кода, а не внешней декларацией.

Глобальное игнорирование через первый объект конфигурации

Часто используется паттерн, при котором первый объект конфигурации содержит глобальные исключения:

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

Такой подход обеспечивает единый слой фильтрации до применения любых правил.

Локальные исключения и ограничение области files

Хотя ignores работает глобально, ограничение области анализа чаще реализуется через files, а не через отрицательные шаблоны.

export default [
  {
    ignores: ["**/*.test.js"]
  },
  {
    files: ["src/**/*.js"],
    rules: {
      "no-debugger": "error"
    }
  }
];

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

Приоритет конфигураций и влияние ignores

В flat config отсутствует классическая модель наследования .eslintrc. Вместо этого порядок объектов в массиве определяет итоговое поведение.

Однако ignores действует на уровне фильтрации входных файлов и не переопределяется последующими объектами.

Это означает:

  • если файл исключён, он не попадает в pipeline ESLint
  • никакие rules, files или languageOptions не могут его «вернуть»
  • переопределение возможно только изменением самого массива ignores

Использование отрицательных паттернов

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

export default [
  {
    ignores: [
      "dist/**",
      "!dist/keep.js"
    ]
  }
];

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

Игнорирование внутри сложных конфигураций

В проектах с несколькими слоями конфигурации (например, монорепозитории) ignores часто комбинируется с разделением files:

export default [
  {
    ignores: ["packages/*/dist/**"]
  },
  {
    files: ["packages/*/src/**/*.js"],
    rules: {
      "no-unused-vars": "error"
    }
  },
  {
    files: ["packages/*/scripts/**/*.js"],
    rules: {
      "no-console": "off"
    }
  }
];

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

Поведение при пересечении шаблонов

Если файл совпадает одновременно с files и ignores, приоритет всегда остаётся за ignores. Это фундаментальное правило flat config: исключения имеют более высокий приоритет, чем включения.

export default [
  {
    ignores: ["src/legacy/**"]
  },
  {
    files: ["src/legacy/**/*.js"],
    rules: {
      "no-var": "error"
    }
  }
];

Несмотря на совпадение files, каталог src/legacy полностью исключён.

Практика структурирования игнорируемых путей

В реальных конфигурациях игнорируемые пути обычно группируются по категориям:

  • зависимости: node_modules
  • сборка: dist, build
  • отчёты: coverage
  • временные файлы: .cache, .temp
  • автогенерируемые ресурсы
ignores: [
  "node_modules/**",
  "dist/**",
  "build/**",
  "coverage/**",
  ".cache/**",
  "*.min.js"
]

Влияние ignores на производительность

Исключение файлов на уровне конфигурации уменьшает объём входных данных для ESLint. Это напрямую влияет на:

  • время обхода файловой системы
  • количество AST-разборов
  • нагрузку на правила анализа кода

Чем раньше файл исключён через ignores, тем меньше вычислений выполняет ESLint.

Ограничения механизма ignores

Несмотря на гибкость, механизм имеет ряд ограничений:

  • отсутствует динамическая логика (только статические шаблоны)
  • нельзя учитывать содержимое файлов
  • нет условий на основе окружения внутри одного объекта
  • невозможно переопределить игнорирование после фильтрации

Эти ограничения компенсируются структурированием массива конфигураций и разделением зон files.

Взаимодействие с инструментами сборки

При использовании сборщиков (Vite, Webpack, Rollup) часто возникает дублирование игнорирования. ESLint flat config не синхронизируется с ними автоматически, поэтому ignores должен явно повторять критические исключения сборки.

Наиболее частый паттерн:

  • сборщик исключает dist
  • ESLint также исключает dist
  • единый источник истины отсутствует без дополнительной обвязки

Роль ignores в архитектуре flat config

Игнорирование файлов в flat config выполняет не вспомогательную, а фундаментальную функцию фильтрации входного множества. В отличие от legacy-конфигурации, где игнорирование было внешним слоем, здесь оно становится частью декларативной структуры конфигурации и участвует в формировании входного набора данных для анализа.