lint-staged: линтинг staged файлов
lint-staged — инструмент для запуска линтеров и форматтеров только на файлах, добавленных в git staging area, а не на всём проекте.
Зачем нужно
Запуск ESLint или Prettier на всём проекте в pre-commit хуке занимает секунды или минуты. lint-staged фильтрует только staged файлы — те, что в git add. Это делает проверку мгновенной и релевантной: исправляем только то, что коммитим.
Где используется
- Pre-commit хук в связке с Husky
- Форматирование кода перед каждым коммитом (Prettier)
- Линтинг изменений перед коммитом (ESLint)
- TypeScript проверка типов только для изменённых файлов
Установка
npm install --save-dev lint-staged
Конфигурация
// package.json
{
"lint-staged": {
"*.{js,jsx,ts,tsx}": [
"eslint --fix",
"prettier --write"
],
"*.{json,md,yaml,yml}": "prettier --write",
"*.css": "prettier --write"
}
}
// lint-staged.config.js — расширенная конфигурация
export default {
'*.{ts,tsx}': [
// Автофикс ESLint
'eslint --fix',
// Форматирование Prettier
'prettier --write',
// TypeScript проверка типов (только для ts файлов)
// Не передаём файлы — tsc проверяет весь проект
=> 'tsc --noEmit',
],
'*.{js,jsx}': ['eslint --fix', 'prettier --write'],
'*.{json,md,css,scss}': 'prettier --write',
// Bash/shell скрипты
'*.sh': 'shellcheck',
};
Интеграция с Husky
# .husky/pre-commit
#!/usr/bin/env sh
. "$(dirname "$0")/_/husky.sh"
npx lint-staged
Как работает
git add src/components/Button.tsx src/utils/api.ts
# При git commit срабатывает pre-commit хук:
# 1. lint-staged получает список staged файлов:
# [Button.tsx, api.ts]
# 2. Применяет правила для *.tsx и *.ts:
# → eslint --fix Button.tsx api.ts
# → prettier --write Button.tsx api.ts
# 3. Если файлы были изменены форматтером — re-stag автоматически
# 4. Если eslint завершился с ошибкой — коммит прерывается
Опции командной строки
# Запуск вручную (без коммита) на staged файлах
npx lint-staged
# Запуск на конкретных файлах (для тестирования)
npx lint-staged --diff="HEAD"
# Подробный вывод
npx lint-staged --verbose
# Не изменять файлы (только проверка)
npx lint-staged --no-stash
Частые ошибки
- ESLint с
--fixи Prettier запускают оба — разные правила форматирования конфликтуют. Решение:eslint-config-prettier => 'tsc --noEmit'передаёт все файлы в tsc — не нужно, TypeScript сам найдёт зависимости- Нет
--fixу ESLint — lint-staged не исправит ошибки, только найдёт их - Запуск тяжёлых тестов в lint-staged — должны быть только линтер и форматтер
Связанные темы
- _MOC Инструменты
- Husky -- Git hooks
- commitlint -- стандарт коммитов
- Автоматизация проверок перед коммитом