Husky & lint-staged (Hooks de Pré-commit)
Execute ESLint e Prettier automaticamente em arquivos versionados antes de cada commit para capturar problemas precocemente.
Busque em todas as páginas da documentação
Execute ESLint e Prettier automaticamente em arquivos versionados antes de cada commit para capturar problemas precocemente.
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥
Cartão de receita de referência rápida - pronto para copiar e colar.
# Instale husky e lint-staged
npm install --save-dev husky lint-staged
# Inicialize o husky
npx husky init
# O comando init cria .husky/pre-commit
# Edite-o para executar lint-staged
echo "npx lint-staged" > .husky/pre-commitQuando usar isso: Qualquer projeto de equipe onde você queira garantir que o código commitado passe nas verificações de linting e formatação.
# .husky/pre-commit
npx lint-staged// package.json
{
"scripts": {
"lint": "next lint",
"format": "prettier --write .",
"prepare": "husky"
},
"lint-staged": {
"*.{ts,tsx}": [
"eslint --fix --no-warn-ignored",
"prettier --write"
],
"*.{css,json,md}": [
"prettier --write"
]
}
}O que isso demonstra:
git add)prepare garante que o husky seja instalado automaticamente após npm install.husky/pre-commit) para executar comandos antes de cada commitgit diff --staged e os passa para os comandos configuradosprepare é executado após npm install, garantindo que os hooks sejam configurados para cada desenvolvedorCom Biome em vez de ESLint + Prettier:
{
"lint-staged": {
"*.{ts,tsx,js,jsx,json,css}": [
"biome check --write --no-errors-on-unmatched"
]
}
}Com verificação de tipos (mais lento, mas completo):
{
"lint-staged": {
"*.{ts,tsx}": [
"eslint --fix --no-warn-ignored",
"prettier --write"
]
}
}# .husky/pre-commit
npx lint-staged
npx tsc --noEmitNota: tsc --noEmit verifica todo o projeto, não apenas os arquivos versionados, pois o TypeScript precisa do contexto completo do projeto.
Linting de mensagens de commit com commitlint:
npm install --save-dev @commitlint/cli @commitlint/config-conventional
echo "npx commitlint --edit \$1" > .husky/commit-msg// commitlint.config.js
export default { extends: ["@commitlint/config-conventional"] };Ignorando hooks (válvula de escape):
# Quando você realmente precisar ignorar (depuração, commits WIP)
git commit --no-verify -m "WIP: work in progress"// lint-staged passa caminhos de arquivo para o ESLint, que funciona
// com arquivos TypeScript perfeitamente, desde que @typescript-eslint
// esteja configurado.
// Nota: ESLint --fix pode corrigir automaticamente alguns problemas de TypeScript:
// - Remover imports não utilizados
// - Adicionar a palavra-chave `type` a imports apenas de tipo
// - Corrigir violações de consistent-type-importsCoisas que vão te morder. Cada armadilha inclui o que dá errado, por que acontece e a correção.
Hooks não executando após clonar - Hooks do Git não são commitados no repositório; eles vivem em .git/hooks/. Novos desenvolvedores precisam executar npm install (que aciona prepare). Correção: Certifique-se de que "prepare": "husky" esteja em seus scripts do package.json.
Avisos do ESLint em arquivos ignorados - Quando lint-staged passa caminhos de arquivo para o ESLint, arquivos que correspondem aos seus ignores do ESLint geram avisos. Correção: Adicione o flag --no-warn-ignored ao comando ESLint na configuração do lint-staged.
Problemas de staging parcial - Se você versionar apenas parte de um arquivo (git add -p), lint-staged opera no arquivo completo, que pode incluir alterações não versionadas. Correção: Esteja ciente dessa limitação. Para casos críticos, comite o arquivo completo.
Hooks de pré-commit lentos - Executar a verificação de tipos (tsc) em cada commit pode levar 10 segundos ou mais em projetos grandes. Correção: Execute tsc apenas em CI. Mantenha os hooks de pré-commit rápidos limitando-os a ESLint e Prettier em arquivos versionados.
CI não executa hooks - Hooks do Git são apenas locais. Ambientes de CI não executam hooks de pré-commit. Correção: Sempre execute verificações de lint e formatação em CI como uma rede de segurança. Veja Linting em CI/CD.
Outras maneiras de resolver o mesmo problema - e quando cada uma é a melhor escolha.
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
lefthook | Você quer hooks mais rápidos com execução paralela, escritos em Go | Husky + lint-staged funciona bem para o seu projeto |
| Linting apenas em CI | Você não quer desacelerar os commits locais | Você quer feedback instantâneo antes de fazer push |
nano-staged | Você quer uma alternativa menor e mais rápida para lint-staged | Você precisa de recursos avançados do lint-staged, como resolvedores personalizados |
| Formatar ao salvar no VS Code | Desenvolvedor solo, sem CI | Projetos em equipe onde a consistência deve ser imposta |
npm install.npx husky init.git diff --staged (arquivos que você adicionou com git add).git commit --no-verify -m "WIP: work in progress"Use isso com moderação para depuração ou commits WIP. A CI ainda capturará problemas.
.git/hooks/, que não é commitado no repositório.npm install, que aciona o script prepare."prepare": "husky" esteja em seus scripts do package.json.# .husky/pre-commit
npx lint-staged
npx tsc --noEmittsc --noEmit verifica todo o projeto, não apenas os arquivos versionados.tsc apenas em CI para manter os hooks rápidos.{
"lint-staged": {
"*.{ts,tsx,js,jsx,json,css}": [
"biome check --write --no-errors-on-unmatched"
]
}
}npm install --save-dev @commitlint/cli @commitlint/config-conventional
echo "npx commitlint --edit \$1" > .husky/commit-msgIsso impõe mensagens de commit convencionais como feat:, fix:, docs:.
git add manualmente nos arquivos após o auto-fix do ESLint ou Prettier.--no-warn-ignored ao comando ESLint na sua configuração do lint-staged.type a imports apenas de tipo.consistent-type-imports.import/order.Revisado por Chris St. John·Última atualização: 16 de jul. de 2026
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥