Флаг --fix активирует систему автоматического
исправления нарушений правил линтинга, реализованную в ESLint через
механизм fixers. При анализе файлов ESLint формирует список
найденных проблем, после чего повторно проходит по результатам и
применяет только те изменения, которые явно помечены правилами как
исправляемые.
Каждое правило в ESLint может возвращать объект исправления через API контекста:
context.report({ fix(fixer) { ... } })Исправления агрегируются и применяются после завершения анализа файла. В результате файл перезаписывается уже с учётом внесённых изменений.
Ключевой момент: автоматические правки не являются побочным эффектом линтинга, они выполняются отдельным этапом, что позволяет сначала собрать все ошибки, затем применить изменения атомарно.
ESLint поддерживает ограниченный набор типов автоматических правок. Внутри движка исправления классифицируются по характеру изменений:
Однако не каждое правило может быть автоматически исправлено. Для этого правило должно явно объявить возможность фиксации:
meta.fixable: "code" — исправления, затрагивающие
синтаксис и структуруmeta.fixable: "whitespace" — исправления, связанные с
форматированиемЕсли правило не имеет fixable, флаг --fix
его игнорирует.
Примеры типичных автоматических исправлений:
Процесс применения --fix можно разложить на несколько
этапов:
fix-операцийОсобое значение имеет проверка конфликтующих фиксов. Если два исправления затрагивают один и тот же диапазон кода, ESLint может:
Это ограничение связано с тем, что система не выполняет полноценный рефакторинг AST, а работает на уровне текстовых диапазонов.
ESLint придерживается принципа «safe fix only». Это означает, что любые изменения должны гарантированно сохранять поведение программы.
По этой причине:
Например, правило может предложить исправление, но оно не будет применено, если существует риск изменения семантики:
Флаг используется на уровне командной строки:
eslint src --fix
В этом режиме ESLint:
Важный аспект: если файл содержит ошибки, но ни одно правило не поддерживает автоматическое исправление, файл остаётся без изменений.
При использовании в больших проектах --fix часто
комбинируется с указанием конкретных директорий:
eslint "src/**/*.{js,ts}" --fix
Поведение --fix напрямую зависит от конфигурации
ESLint:
error, warn) не влияет
на применимость фиксаОсобое значение имеют кастомные правила из плагинов. Если плагин
реализует fix, он становится частью общей системы
исправлений и подчиняется тем же ограничениям.
При наличии нескольких правил, изменяющих один участок кода, возникает конкуренция исправлений. ESLint применяет их с учётом внутреннего порядка:
Если пересечение невозможно разрешить безопасно, исправление пропускается.
Это особенно заметно при работе с форматированием, когда несколько правил пытаются модифицировать один и тот же пробел или символ.
После применения исправлений ESLint может повторно запустить линтинг для проверки результата. Это связано с тем, что одно исправление может устранить одни ошибки и одновременно создать новые.
Пример сценария:
Поэтому результат работы --fix не всегда является
финальным состоянием кода с точки зрения всех правил.
Флаг --fix имеет ряд системных ограничений:
Дополнительно ESLint не гарантирует, что повторный запуск с
--fix не изменит результат, если правила взаимодействуют
сложным образом.
В CI/CD --fix применяется ограниченно, поскольку
изменение файлов во время сборки может быть нежелательным. Типовые
сценарии:
В автоматизированных пайплайнах чаще используется режим проверки без фиксации:
eslint src
или с генерацией отчёта.
ESLint не заменяет файл целиком, а применяет точечные изменения. Это означает:
Однако при массовых изменениях форматирования итоговый diff может быть значительным, особенно при подключении правил стилистики.
В современных конфигурациях ESLint (flat config и новые версии
парсеров) механизм --fix остаётся неизменным по концепции,
но зависит от корректной работы AST.
Если парсер:
то автоматические исправления могут быть неточными или частично отключёнными.
Это особенно критично при использовании нестандартных синтаксисов (TypeScript, JSX, экспериментальные предложения ECMAScript).