Husky + lint-staged

Автоматический запуск линтера и форматтера только на staged-файлах при каждом git commit — проблемный код не попадёт в репозиторий.

Задача

Нужно гарантировать, что в репозиторий не попадёт код с ошибками ESLint или неотформатированный Prettier. Проверять вручную или в CI — поздно; проверка должна быть на уровне git hook.

Решение

Установка:

npm install -D husky lint-staged
npx husky init

После husky init появится папка .husky/ и скрипт prepare в package.json.

.husky/pre-commit (создаётся автоматически, отредактируй):

npx lint-staged

package.json — добавь секцию lint-staged:

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

Проверка — измени файл и сделай коммит:

git add src/index.ts
git commit -m "test"
# lint-staged запустит ESLint и Prettier только для src/index.ts

Ключевые моменты

  • lint-staged запускает инструменты только на изменённых файлах, а не на всём проекте — быстро даже в больших репо.
  • husky init автоматически добавляет "prepare": "husky" в package.json — хуки устанавливаются при npm install.
  • Порядок команд важен: сначала eslint --fix, потом prettier --write (Prettier перезапишет то, что исправил ESLint).
  • Если хук должен провалить коммит — ESLint завершится с кодом 1 при неисправимых ошибках, коммит отменится.

Варианты

  • Добавить commit-msg хук для проверки формата сообщения коммита (Conventional Commits):
    # .husky/commit-msg
    npx --no -- commitlint --edit $1
    
  • pre-push хук — запуск тестов перед push:
    # .husky/pre-push
    npm test
    

Связанные рецепты / темы