В этом видео я покажу как настроить автопроверку кода через ES lint при совершении коммита. Таким образом легче проверять и поддерживать чистоту и порядок внутри кодовой базы, особенно на проектах с командной разработкой.
Смотреть видео на Дзене (dzen.ru)
1. Создание проекта
Создадим проект с помощью Vite на React без TypeScript.
npx create-vite@latest react-husky
- React
- JavaScript
- rolldown-vite (experimental) — No
Установим зависимости npm i
и запустим npm run dev
В проекте уже установлен и базово настроен ESlint.
Файл с конфигом eslint.config.js
Пакеты в package.json
"@eslint/js": "^9.36.0", "eslint": "^9.36.0", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.20",
Также в package.json уже есть скрипт запуска ESlint
"lint": "eslint ."
Опционально. Добавим сюда еще один полезный скрипт, запуск ESlint с флагом --fix
чтобы он проверял код и по возможности фиксит те ошибки которые может.
"lint:fix": "eslint . --fix",
Мы уже можем запустить линтер командой npm run lint
2. Установка lint-staged
Установим в проект пакет lint-staged и настроим его:
npm i lint-staged -D
Добавим в packge.json раздел с "lint-staged”
, сразу после “scripts”
:
"lint-staged": { "*.{js,jsx}": [ "eslint . --fix --no-cache --max-warnings=0" ] },
3. Создать git репозиторий в проекте
Создадим репозиторий в проекте и сделаем первый коммит:
git init git add . git commit -m "first commit"
4. Установим Husky в проект:
https://typicode.github.io/husky/get-started.html
npm install --save-dev husky npx husky init
В проекте появится папка .husky
⚠️ Важно! Внутри папки
.husky
будет папка_
и файлpre-commit
Также в package.json
отобразится установленный пакет husky, а также добавится скрипт:
"prepare": "husky" ... "husky": "^9.1.7",
Отредактируем файл .husky/pre-commit
, заменим его содержимое на:
npx lint-staged
⚠️ Важен порядок настройки
На момент инициализации
husky
в проекте уже должен бытьGIT
репозиторий и установлен и прописанlint-staged
.Сначала устанавливаем и прописываем
lint-staged
. И только после этого устанавливаем и инициализируемhusky
. При инициализацииhusky
lint-staged
уже должен быть установлен и настроен (прописан вpackage-json
).
5. Тестируем 👨🏻💻
Теперь можно допустить “ошибку” в JS коде. Например создать переменную и нигде её не использовать. В конфиге eslint.config.js у нас есть правило которое запрещает размещать в проекте неиспользуемые переменные:
rules: { 'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }], },
Создадим неиспользуемую переменную в App.jsx
const name = 'React Developer';
Запустим npm run lint
и увидеим что ошибка есть.
npm run lint react-husky-article/src/App.jsx 8:9 error 'name' is assigned a value but never used. Allowed unused vars must match /^[A-Z_]/u no-unused-vars ✖ 1 problem (1 error, 0 warnings)
Теперь при попытке коммита такого кода husky запустит eslint и выведет эту ошибку, не дав сделать коммит пока она не будет устранена:
git add . git commit -m "test" ✔ Backed up original state in git stash (fde3b4c) ⚠ Running tasks for staged files... ❯ package.json — 1 file ❯ *.{js,jsx} — 1 file ✖ eslint --fix --max-warnings=0 [FAILED] ↓ Skipped because of errors from tasks. ✔ Reverting to original state because of errors... ✔ Cleaning up temporary files... ✖ eslint --fix --max-warnings=0: /react-husky-article/src/App.jsx 8:9 error 'name' is assigned a value but never used. Allowed unused vars must match /^[A-Z_]/u no-unused-vars ✖ 1 problem (1 error, 0 warnings)
Исправим ошибку, удалив неиспользуемую переменную, добавим изменения в staged командой git add .
и повторно сделаем коммит:
// удалить const name = 'React Developer'; из App.jsx git add . git commit -m "test" // Коммит пройдет успешно: ✔ Backed up original state in git stash (8bb2e93) ✔ Running tasks for staged files... ✔ Applying modifications from tasks... ✔ Cleaning up temporary files... [master 83b29f9] test 1 file changed, 1 deletion(-)
⚠️ Важно! После исправлений, необходимо добавить их в staged area командой git add . потому что Husky в связке с lint-staged проверяет только стейдженные изменения, а не файлы в общем.