Integração ESLint + Prettier
Faça ESLint e Prettier trabalharem juntos sem conflitos, separando responsabilidades: ESLint para qualidade de código, Prettier para formatação.
Busque em todas as páginas da documentação
Faça ESLint e Prettier trabalharem juntos sem conflitos, separando responsabilidades: ESLint para qualidade de código, Prettier para formatação.
🤖 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 o pacote de compatibilidade
npm install --save-dev eslint-config-prettier
# É só isso - não precisa de eslint-plugin-prettier// scripts do package.json (execute-os separadamente)
{
"scripts": {
"lint": "next lint",
"lint:fix": "next lint --fix",
"format": "prettier --write .",
"format:check": "prettier --check .",
"check-all": "npm run format:check && npm run lint"
}
}Quando usar isso: Qualquer projeto que use tanto ESLint quanto Prettier (o que é a maioria dos projetos React/Next.js).
// eslint.config.mjs
import { FlatCompat } from "@eslint/eslintrc";
import { dirname } from "path";
import { fileURLToPath } from "url";
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const compat = new FlatCompat({ baseDirectory: __dirname });
const eslintConfig = [
...compat.extends(
"next/core-web-vitals",
"next/typescript",
"prettier", // Deve ser o ÚLTIMO - desabilita as regras de formatação do ESLint
),
{
rules: {
// Regras de qualidade de código (não de formatação) - estas não conflitarão
"@typescript-eslint/no-unused-vars": [
"error",
{ argsIgnorePattern: "^_" },
],
"react-hooks/exhaustive-deps": "warn",
"import/order": [
"warn",
{
groups: ["builtin", "external", "internal"],
"newlines-between": "always",
},
],
},
},
];
export default eslintConfig;// .prettierrc
{
"semi": true,
"singleQuote": false,
"tabWidth": 2,
"trailingComma": "all",
"printWidth": 80,
"plugins": ["prettier-plugin-tailwindcss"]
}O que isso demonstra:
eslint-config-prettier (o extend "prettier") desabilita todas as regras do ESLint que conflitam com o Prettierindent, semi, quotes) e regras de qualidade de código (ex: no-unused-vars, react-hooks/exhaustive-deps).eslint-config-prettier desliga todas as regras do ESLint que o Prettier lida, eliminando conflitos.extends para que sobrescreva todas as configs anteriores.Por que NÃO usar eslint-plugin-prettier:
// ❌ Esta abordagem executa o Prettier dentro do ESLint
// eslint-plugin-prettier - NÃO recomendado
{
plugins: ["prettier"],
rules: {
"prettier/prettier": "error",
},
}Problemas com esta abordagem:
Abordagem recomendada: execute-os separadamente:
{
"scripts": {
"lint": "next lint",
"lint:fix": "next lint --fix",
"format": "prettier --write .",
"format:check": "prettier --check .",
"fix-all": "npm run lint:fix && npm run format"
}
}Abordagem de hook de pré-commit (o melhor dos dois mundos):
// package.json
{
"lint-staged": {
"*.{ts,tsx}": ["eslint --fix", "prettier --write"],
"*.{css,json,md}": ["prettier --write"]
}
}// Ambas as ferramentas funcionam perfeitamente em arquivos .ts e .tsx.
// O ESLint detecta problemas cientes de tipos:
const unused = "hello"; // @typescript-eslint/no-unused-vars ❌
// O Prettier cuida da formatação:
const obj = { a: 1, b: 2, c: 3 }; // Prettier controla espaçamento, vírgulas finais, etc.
// Sem sobreposição - cada ferramenta faz seu trabalho.Coisas que vão te morder. Cada armadilha inclui o que dá errado, por que acontece e a correção.
A ordem da configuração importa - Se "prettier" não for o último item em extends, as regras de formatação do ESLint de configs subsequentes serão reativadas e entrarão em conflito. Correção: Sempre coloque "prettier" por último no seu array extends.
Verificando conflitos - Você não tem certeza se uma regra conflita. Correção: Execute npx eslint-config-prettier 'src/**/*.tsx' para listar as regras que conflitam com o Prettier. A ferramenta CLI relata exatamente quais regras desativar.
Formatação diferente em CI vs local - Se os desenvolvedores não tiverem formatação ao salvar habilitada, a CI detecta erros de formatação que eles nunca viram. Correção: Use Husky + lint-staged para formatar automaticamente antes de cada commit.
A ordem de importação não é formatação - import/order é uma regra de qualidade de código que o Prettier não lida (o Prettier não reordena importações). Correção: Mantenha import/order no ESLint; ele não conflita com o Prettier. Alternativamente, use prettier-plugin-organize-imports.
Outras maneiras de resolver o mesmo problema - e quando cada uma é a melhor escolha.
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Biome | Você quer linting + formatação em uma única ferramenta com zero conflitos | Você precisa do ecossistema de plugins do ESLint |
| Apenas Prettier (sem ESLint) | Projeto muito pequeno sem preocupações com qualidade de código | Você quer capturar bugs, variáveis não utilizadas ou violações de hook |
| Apenas ESLint (com regras de formatação) | Você se recusa a adicionar outra ferramenta | Você quer formatação consistente e opinativa |
extends para que sobrescreva todas as configs anteriores."prettier" serão reativadas."prettier" por último no seu array extends.npx eslint-config-prettier 'src/**/*.tsx'Esta ferramenta CLI relata exatamente quais regras ativas conflitam com o Prettier.
import/order é uma regra de qualidade de código, não uma regra de formatação.{
"scripts": {
"lint": "next lint",
"lint:fix": "next lint --fix",
"format": "prettier --write .",
"format:check": "prettier --check .",
"fix-all": "npm run lint:fix && npm run format"
}
}Execute-os como comandos separados, não como uma única ferramenta combinada.
{
"lint-staged": {
"*.{ts,tsx}": ["eslint --fix", "prettier --write"],
"*.{css,json,md}": ["prettier --write"]
}
}O ESLint corrige problemas de qualidade de código primeiro, depois o Prettier formata.
@typescript-eslint/no-unused-vars não são afetadas.eslint-config-prettier garante que não haja sobreposição entre os dois.npm run format:check && npm run lintformat:check verifica se os arquivos estão formatados sem modificá-los.lint executa o ESLint para qualidade de código.Revisado por Chris St. John·Última atualização: 19 de jul. de 2026
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥