Настройка lint-staged для проверки кода перед коммитом

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

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Предлагаемые услуги
Показано 1 из 1 услугВсе 2065 услуг
Настройка lint-staged для проверки кода перед коммитом
Простая
~2-3 часа
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    874
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    851

Настройка lint-staged для проверки кода перед коммитом

lint-staged запускает команды только для файлов добавленных в git staging area. Разница принципиальная: ESLint на весь проект из 500 файлов занимает 20–30 секунд, ESLint только на 3 изменённых файла — меньше секунды. Это делает pre-commit проверку практически незаметной.

Установка

npm install --save-dev lint-staged

Обычно устанавливается вместе с Husky. .husky/pre-commit должен содержать:

npx lint-staged

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

lint-staged.config.mjs:

export default {
  // TypeScript и JavaScript
  '**/*.{ts,tsx,js,jsx}': [
    'eslint --fix --max-warnings 0',
    'prettier --write',
  ],

  // CSS и SCSS
  '**/*.{css,scss}': [
    'stylelint --fix',
    'prettier --write',
  ],

  // JSON, Markdown, YAML — только форматирование
  '**/*.{json,md,yml,yaml}': [
    'prettier --write',
  ],
};

Порядок команд важен: сначала линтер (может изменить код), потом форматтер (приводит к единому виду).

Конфигурация в package.json

Альтернативно можно объявить прямо в package.json:

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

TypeScript typecheck на staged файлах

Проблема: tsc --noEmit не принимает список файлов — он проверяет весь проект. Обойти это можно через скрипт-обёртку:

// scripts/typecheck-staged.mjs
import { execSync } from 'node:child_process';

try {
  execSync('tsc --noEmit --incremental', { stdio: 'inherit' });
} catch {
  process.exit(1);
}
// lint-staged.config.mjs
export default {
  '**/*.{ts,tsx}': [
    'eslint --fix',
    'prettier --write',
    () => 'node scripts/typecheck-staged.mjs',  // функция — игнорирует список файлов
  ],
};

() => 'command' — когда команда возвращается функцией, lint-staged не передаёт ей список файлов как аргументы.

Параллельный запуск

По умолчанию lint-staged запускает команды для разных glob-паттернов параллельно. Если это вызывает проблемы (например, два процесса пишут в один файл):

export default {
  concurrent: false,  // последовательный запуск
  '**/*.{ts,tsx,js,jsx}': ['eslint --fix'],
};

Дополнительные проверки

Проверка размера файлов (случайно не закоммитить большой бинарник):

npm install --save-dev bundlesize
export default {
  '**/*.{js,css}': [
    'bundlesize',
  ],
  // Запрет на коммит файлов > 500KB
  '**/*': (files) => {
    const { statSync } = require('node:fs');
    const large = files.filter(f => {
      try { return statSync(f).size > 512 * 1024; }
      catch { return false; }
    });
    if (large.length) {
      console.error('Large files:', large);
      process.exit(1);
    }
  },
};

Проверка на secrets через git-secrets или detect-secrets:

export default {
  '**/*': 'detect-secrets scan',
  '**/*.{ts,tsx,js,jsx}': ['eslint --fix', 'prettier --write'],
};

Отладка

# Посмотреть что будет запущено без реального запуска
npx lint-staged --debug --dry-run

Вывод показывает: какие файлы попали под какие паттерны, какие команды будут выполнены.

Сроки

Настройка lint-staged с ESLint и Prettier: 30–60 минут. Добавление typecheck и кастомных проверок: ещё 1–2 часа.