PurpleSchool — курсы программирования онлайн
  • Пути
    • Frontend React разработчик
    • Frontend Vue разработчик
    • Backend разработчик Node.js
    • Fullstack разработчик React / Node.js
    • Mobile разработчик React Native
    • Backend разработчик Golang
    • Devops инженер
    • Backend разработчик Python
  • AI для кодаНовое
  • О нас
    • Отзывы
    • Реферальная программа
    • О компании
    • Контакты
  • Иконка открытия меню
    • Сообщество
    • PurpleПлюс
    • AI Собеседование
    • AI тренажёр
    • Проекты
PurpleSchool — платформа бесплатных roadmap и курсов для разработчиков
ютуб иконка
Telegram иконка
VK иконка
VK иконка
Курсы
ГлавнаяКаталог курсовFrontendBackendFullstack
Практика
КарьераПроектыPurpleПлюс
Материалы
БлогБаза знаний
Документы
Договор офертаПолитика конфиденциальностиПроверка сертификатаМиграция курсовРеферальная программа
Реквизиты
ИП Ларичев Антон АндреевичИНН 773373765379contact@purpleschool.ru

PurpleSchool © 2020 -2026 Все права защищены

  • Курсы
    • FrontendИконка стрелки
    • AI разработкаИконка стрелки
    • BackendИконка стрелки
    • DevOpsИконка стрелки
    • MobileИконка стрелки
    • ТестированиеИконка стрелки
    • Soft-skillsИконка стрелки
    • ДизайнИконка стрелки
    Иконка слояПерейти в каталог курсов
  • Бесплатно
    • Курсы
    • JavaScript Основы разработкиPython Основы PythonCSS CSS FlexboxКарта развития
    • База знанийИконка стрелки
    • Новостные рассылкиИконка стрелки
  • PurpleSchool — курсы программирования онлайн
    • AI для кодаНовое
    • Сообщество
    • PurpleПлюс
    • AI Собеседование
    • AI тренажёр
    • Проекты
    Главная
    Сообщество
    Как настроить ESLint и Prettier в проекте раз и навсегда

    Как настроить ESLint и Prettier в проекте раз и навсегда

    Аватар автора Как настроить ESLint и Prettier в проекте раз и навсегда

    Антон Ларичев

    Иконка календаря25 мая 2026
    ESLintPrettierJavaScriptTypeScriptDevToolsjuniorИконка уровня junior
    Картинка поста Как настроить ESLint и Prettier в проекте раз и навсегда

    Введение

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

    В этой статье разберём, как настроить ESLint и Prettier один раз так, чтобы они работали в связке без конфликтов, автоматически форматировали код при сохранении и блокировали коммиты с нарушениями. Подход универсален для React, Next.js, Node.js и любых других проектов на JS/TS.

    Установка зависимостей

    Для старта установим базовый набор пакетов. Если используете TypeScript, добавьте парсер и плагин для него.

    npm install --save-dev eslint prettier \
      eslint-config-prettier \
      @typescript-eslint/parser \
      @typescript-eslint/eslint-plugin
    

    Ключевой пакет здесь — eslint-config-prettier. Он отключает все правила ESLint, которые конфликтуют с Prettier. Раньше многие использовали eslint-plugin-prettier, чтобы запускать Prettier как правило ESLint, но сейчас официальная документация Prettier рекомендует этого избегать: подсветка ошибок форматирования замусоривает редактор и замедляет линтинг.

    Конфигурация ESLint

    С ESLint 9 по умолчанию используется flat config — файл eslint.config.js в корне проекта. Создадим минимальный, но рабочий конфиг для TypeScript-проекта.

    // eslint.config.js
    import js from '@eslint/js';
    import tseslint from 'typescript-eslint';
    import prettier from 'eslint-config-prettier';
    
    export default [
      // базовые рекомендации ESLint
      js.configs.recommended,
      // рекомендации для TypeScript
      ...tseslint.configs.recommended,
      // отключаем правила, конфликтующие с Prettier (всегда последним)
      prettier,
      {
        rules: {
          // запрещаем console.log, но разрешаем warn и error
          'no-console': ['warn', { allow: ['warn', 'error'] }],
          // неиспользуемые переменные с префиксом _ игнорируем
          '@typescript-eslint/no-unused-vars': [
            'error',
            { argsIgnorePattern: '^_', varsIgnorePattern: '^_' },
          ],
        },
      },
    ];
    

    Важный момент: prettier из eslint-config-prettier должен идти последним в массиве. Только так он сможет отключить конфликтующие правила, добавленные другими конфигами выше.

    Конфигурация Prettier

    Prettier настраивается отдельно, через файл .prettierrc или prettier.config.js. Конфиг намеренно минималистичен — у Prettier мало настроек, и это его философия.

    // prettier.config.js
    export default {
      // одинарные кавычки вместо двойных
      semi: true,
      singleQuote: true,
      // длина строки до переноса
      printWidth: 100,
      // 2 пробела для отступа
      tabWidth: 2,
      // запятая после последнего элемента в объектах и массивах
      trailingComma: 'all',
      // перенос стрелочных функций с одним аргументом
      arrowParens: 'always',
    };
    

    Не забудьте про .prettierignore — он работает по тем же правилам, что и .gitignore.

    node_modules
    dist
    build
    coverage
    .next
    

    Скрипты в package.json

    Добавим команды для запуска линтера и форматтера в package.json. Это пригодится и локально, и в CI.

    {
      "scripts": {
        "lint": "eslint .",
        "lint:fix": "eslint . --fix",
        "format": "prettier --write .",
        "format:check": "prettier --check ."
      }
    }
    

    format:check особенно удобен в CI: команда не меняет файлы, а только возвращает ненулевой код выхода, если форматирование нарушено.

    Интеграция с VS Code

    Чтобы код форматировался автоматически при сохранении, добавьте в проект файл .vscode/settings.json. Он переопределит пользовательские настройки только для этого репозитория — никаких сюрпризов для команды.

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

    Теперь при каждом сохранении файла Prettier форматирует код, а ESLint автоматически фиксит правила, которые умеет чинить.

    Pre-commit хуки через Husky и lint-staged

    Даже с автоформатированием в редакторе кто-то закоммитит непроверенный код. Решение — запускать линтер на staged-файлах перед коммитом.

    npm install --save-dev husky lint-staged
    npx husky init
    

    В package.json добавим конфиг lint-staged, который обработает только изменённые файлы — это быстро даже на больших проектах.

    {
      "lint-staged": {
        "*.{js,jsx,ts,tsx}": [
          "eslint --fix",
          "prettier --write"
        ],
        "*.{json,md,css}": [
          "prettier --write"
        ]
      }
    }
    

    Затем в .husky/pre-commit пропишем запуск npx lint-staged. После этого ни один невалидный коммит не пройдёт.

    Частые ошибки

    Plugin Prettier внутри ESLint. Связка eslint-plugin-prettier и plugin:prettier/recommended создаёт шум в редакторе: каждая лишняя запятая подсвечивается как ошибка линтера. Используйте только eslint-config-prettier.

    Конфиг Prettier не последний. Если поставить prettier в середине массива конфигов ESLint, последующие конфиги могут вернуть конфликтующие правила. Правило простое — всегда последним.

    Разные версии в monorepo. В монорепозитории легко получить разные версии ESLint в пакетах. Выносите все linting-зависимости в корневой package.json и используйте workspaces.

    Игнорирование .prettierignore. Без него Prettier попытается форматировать сгенерированные файлы, lock-файлы и содержимое node_modules. Это медленно и иногда ломает сборку.

    Отключение правил по одному. Если приходится писать // eslint-disable-next-line в каждом втором файле — пересмотрите конфиг. Скорее всего, правило просто не подходит проекту.

    Заключение

    Правильная связка ESLint и Prettier настраивается за полчаса, но окупается на всём жизненном цикле проекта. ESLint берёт на себя качество кода, Prettier — единый стиль, eslint-config-prettier устраняет конфликты, VS Code форматирует при сохранении, а Husky с lint-staged защищают репозиторий от грязных коммитов.

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

    Иконка глаза299

    Комментарии

    0

    Постройте личный план изучения Feature-Sliced Design до уровня Middle — бесплатно!

    Feature-Sliced Design — часть карты развития Frontend

    • step100+ шагов развития
    • lessons30 бесплатных лекций
    • lessons300 бонусных рублей на счет

    Бесплатные лекции

    Лучшие курсы по теме

    изображение курса

    Angular

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Гарантия
    Бонусы
    иконка звёздочки рейтинга5.0
    3 999 ₽ 6 990 ₽
    Подробнее
    изображение курса

    Vue 3 и Pinia

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Практика в студииПрактика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.9
    3 999 ₽ 6 990 ₽
    Подробнее
    изображение курса

    Nuxt

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Практика в студииПрактика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга5.0
    3 999 ₽ 6 990 ₽
    Подробнее

    Похожие статьи

    Картинка поста Асинхронность в JavaScript: Event Loop, промисы и async/await
    Иконка аватараАнтон
    Иконка календаря04 июня 2026
    JavaScriptАсинхронностьEvent Loop+ 2middleИконка уровня middle

    Асинхронность в JavaScript: Event Loop, промисы и async/await

    Разбираем асинхронность в JavaScript: как работает Event Loop, чем промисы лучше колбэков и зачем нужен async/await на практике.

    Иконка чипа0
    Иконка глаза147
    Иконка комментариев0
    Картинка поста React Hooks: полный гайд по useState, useEffect, useCallback, useMemo
    Иконка аватараАнтон
    Иконка календаря31 мая 2026
    ReactJavaScriptHooks+ 1middleИконка уровня middle

    React Hooks: полный гайд по useState, useEffect, useCallback, useMemo

    Полный гайд по React Hooks: useState, useEffect, useCallback и useMemo. Разбираем синтаксис, примеры использования и типичные ошибки.

    Иконка чипа+1
    Иконка глаза210
    Иконка комментариев0
    Картинка поста WebSocket на Node.js: строим real-time чат с нуля за час
    Иконка аватараАнтон
    Иконка календаря26 мая 2026
    Node.jsWebSocketJavaScript+ 2middleИконка уровня middle

    WebSocket на Node.js: строим real-time чат с нуля за час

    WebSocket на Node.js: пошаговое руководство по созданию real-time чата с библиотекой ws, обработкой подключений и broadcast-сообщений.

    Иконка чипа0
    Иконка глаза282
    Иконка комментариев0
    Иконка чипа0