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

Зачем использовать ESLint и Prettier вместе

ESLint следит за качеством кода: находит потенциальные ошибки, следит за корректностью импорта, соблюдением типов при использовании TypeScript, и помогает поддерживать архитектурные соглашения. Prettier же отвечает за единообразное форматирование: длинны строк, отступы, кавычки, запятые в объектах.

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

Какие пакеты понадобятся

Ниже — минимальный набор для типичного проекта на JavaScript. Для TypeScript и React добавляются дополнительные пакеты, о них расскажу в соответствующем подразделе.

Пакет Назначение
eslint Ядро линтера
prettier Форматирование кода
eslint-config-prettier Отключает правила ESLint, конфликтующие с Prettier
eslint-plugin-prettier Запускает Prettier как правило ESLint (опционально)
husky, lint-staged Запуск форматирования/линтинга при коммите

Этот набор покрывает базовые случаи. Для TypeScript нужны @typescript-eslint/parser и @typescript-eslint/eslint-plugin. Для React полезен eslint-plugin-react и настройки JSX.

Пошаговая настройка для JavaScript-проекта

Покажу простой сценарий установки с npm. Аналогично работает yarn. Начинаем в корне проекта.

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

npm install --save-dev eslint prettier eslint-config-prettier eslint-plugin-prettier

Создайте базовые конфигурационные файлы. Пример .eslintrc.cjs:

module.exports = {
  env: { browser: true, es2021: true, node: true },
  extends: ['eslint:recommended', 'plugin:prettier/recommended'],
  parserOptions: { ecmaVersion: 12, sourceType: 'module' },
  rules: {
    // ваши правила
  },
};

Файл .prettierrc.json может содержать настройки форматирования:

{
  "printWidth": 100,
  "tabWidth": 2,
  "singleQuote": true,
  "trailingComma": "all"
}

Важно: плагин plugin:prettier/recommended включает eslint-plugin-prettier и eslint-config-prettier, что отключает конфликтные правила и запускает Prettier как правило ESLint. Это удобный вариант для большинства проектов.

Игровая дорожка скриптов

Добавьте в package.json скрипты для удобства:

"scripts": {
  "lint": "eslint . --ext .js,.jsx",
  "format": "prettier --write "src/**/*.{js,jsx,json,css,md}"",
  "prepare": "husky install"
}

Теперь можно вручную запускать npm run lint и npm run format. Для автоматической проверки при коммите используйте husky и lint-staged, о них ниже.

Дополнения для TypeScript и React

TypeScript требует отдельного парсера и набора правил. Это несложно, но нужно помнить про порядок расширений в extends и корректную настройку parserOptions.

Необходимые зависимости:

  • @typescript-eslint/parser
  • @typescript-eslint/eslint-plugin
  • eslint-plugin-react (для проектов с JSX)

Пример .eslintrc.cjs для TypeScript + React:

module.exports = {
  parser: '@typescript-eslint/parser',
  env: { browser: true, es2021: true },
  extends: [
    'eslint:recommended',
    'plugin:react/recommended',
    'plugin:@typescript-eslint/recommended',
    'plugin:prettier/recommended'
  ],
  parserOptions: {
    ecmaFeatures: { jsx: true },
    project: './tsconfig.json',
    sourceType: 'module'
  },
  settings: { react: { version: 'detect' } },
  rules: {
    // добавьте желаемые правила
  }
};

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

Интеграция в редактор и CI

Чтобы команда не спорила о форматировании, настроим автоматическое применение правил в редакторе и в системе непрерывной интеграции. Для VSCode достаточно установить расширения ESLint и Prettier, а затем включить форматирование при сохранении.

Пример настроек VSCode в settings.json:

{
  "editor.formatOnSave": true,
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "eslint.format.enable": true,
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": true
  }
}

В CI нужно запускать lint и fail-пайплайн, если есть ошибки, и при желании — отдельный шаг format-check, который проверяет, что код отформатирован:

npm run lint
npm run format -- --check

Для командной работы полезно настроить husky + lint-staged, чтобы формат и автофикс запускались перед коммитом:

npm install --save-dev husky lint-staged
npx husky install
# в package.json
"lint-staged": {
  "src/**/*.{js,jsx,ts,tsx}": [
    "prettier --write",
    "eslint --fix",
    "git add"
  ]
}

Типичные конфликты и способы их разрешения

Чаще всего возникают споры о кавычках, запятых и отступах. Решение простое: дать Prettier полномочия на все форматирование и отключить соответствующие правила ESLint. Это делает eslint-config-prettier.

Еще одна проблема — дублирование функционала: если использовать eslint-plugin-prettier, Prettier запускается как правило ESLint, и вы видите форматерные ошибки в выводе ESLint. Это удобно, но может замедлять процесс линтинга в больших проектах. Можно вместо плагина запускать Prettier отдельно командой format.

Для TypeScript важно не забывать про parserOptions.project. Без него некоторые правила @typescript-eslint не работают корректно. Также при миграции большого кода советую включать строгие правила постепенно, иначе команда может столкнуться с потоком мелких исправлений.

Практические советы из реальной работы

В одном из проектов команда два месяца спорила о стиле кавычек и точек с запятой. Я предложил принять Prettier с минимальными настройками и обязать всех использовать форматтер через pre-commit. В результате обсуждение закончилось, а производительность выросла: ревью стали фокусироваться на логике, а не на пробелах.

Еще одна ситуация: при включении eslint-plugin-prettier CI начал падать у половины разработчиков. Оказалось, что локальные редакторы форматировали код иначе. Решение — унифицировать настройки редактора и добавить форматирование в pre-commit, тогда локальные отличия исчезают.

Чеклист для быстрой проверки перед релизом

Ниже список действий, которые стоит проделать, чтобы проект был в порядке и новые члены команды не теряли время на настройку.

  • Добавить в репозиторий .eslintrc и .prettierrc с базовыми настройками.
  • Установить husky и lint-staged для форматирования и автофикса при коммите.
  • Настроить CI на запуск lint и проверку форматирования.
  • Обновить README с инструкцией запуска lint и format.
  • При миграции большого кода использовать —fix и поэтапное ужесточение правил.

Настройка ESLint и Prettier — не магия, а набор простых правил и привычек. Отдавайте форматирование Prettier, делегируйте ESLint семантические и архитектурные проверки, обязательно интегрируйте инструменты в workflow команды. Это снизит шум в код-ревью и позволит сосредоточиться на действительно важных вещах.