ESLint para Scripts Node.js
Configure o ESLint flat config (eslint.config.js) para projetos de scripts Node.js com suporte a TypeScript, regras específicas do Node e linting ciente de tipos.
Busque em todas as páginas da documentação
Configure o ESLint flat config (eslint.config.js) para projetos de scripts Node.js com suporte a TypeScript, regras específicas do Node e linting ciente de tipos.
🤖 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.
# Inicialize uma nova configuração ESLint interativamente
npm init @eslint/config@latest
# Instale a toolchain principal para um projeto de script Node.js TypeScript
npm install --save-dev \
eslint \
typescript-eslint \
eslint-plugin-n \
globals
# Faça o lint dos seus scripts
npx eslint .
# Faça o lint e corrija automaticamente
npx eslint . --fixQuando usar isso: Qualquer projeto Node.js autônomo - CLIs, scripts de build, automação ou pacotes de ferramentas de monorepo - que não faz parte de um aplicativo Next.js/React.
// eslint.config.js
import js from "@eslint/js";
import tseslint from "typescript-eslint";
import nodePlugin from "eslint-plugin-n";
import globals from "globals";
export default tseslint.config(
// Ignores globais - deve ser a única chave em seu próprio objeto
{
ignores: ["dist/", "build/", "coverage/", "node_modules/"],
},
// Regras JS base
js.configs.recommended,
// Regras recomendadas do plugin Node.js (preset de flat config)
nodePlugin.configs["flat/recommended-script"],
// Regras com verificação de tipo TypeScript
...tseslint.configs.strictTypeChecked,
...tseslint.configs.stylisticTypeChecked,
{
files: ["**/*.ts", "**/*.mts"],
languageOptions: {
globals: globals.nodeBuiltin,
parserOptions: {
project: "./tsconfig.json",
tsconfigRootDir: import.meta.dirname,
},
},
rules: {
// Força async/await em vez de chains de promise brutas
"promise/prefer-await-to-then": "off",
"@typescript-eslint/no-floating-promises": "error",
"@typescript-eslint/no-misused-promises": "error",
"@typescript-eslint/return-await": ["error", "always"],
// Regras do plugin Node.js
"n/no-missing-import": "off", // typescript-eslint resolve imports
"n/no-unpublished-import": "off",
"n/no-process-exit": "warn",
},
},
);O que isso demonstra:
tseslint.config() para autoria de config com segurança de tipostrictTypeChecked + stylisticTypeChecked para as regras TS mais rigorosaseslint-plugin-n (o fork mantido de eslint-plugin-node) fornecendo regras específicas do Node.jsparserOptions.projecteslint.config.js (flat config) da raiz do projeto por padrão - sem mais arquivos .eslintrc em cascata.typescript-eslint é distribuído como um único pacote que reexporta @typescript-eslint/parser, @typescript-eslint/eslint-plugin e um helper config() que concatena e tipa objetos de configuração.eslint-plugin-n substitui o eslint-plugin-node abandonado. Ele adiciona regras específicas do Node como n/no-missing-import, n/no-unpublished-bin e n/no-deprecated-api.TypeChecked) exigem que o parser carregue tsconfig.json via parserOptions.project. Sem isso, essas regras silenciosamente não fazem nada.tsconfigRootDir: import.meta.dirname garante que o caminho project seja resolvido em relação ao arquivo de configuração, não ao diretório de trabalho atual.Configuração apenas JavaScript (sem TypeScript):
// eslint.config.js
import js from "@eslint/js";
import nodePlugin from "eslint-plugin-n";
import globals from "globals";
export default [
js.configs.recommended,
nodePlugin.configs["flat/recommended-script"],
{
languageOptions: {
ecmaVersion: "latest",
sourceType: "module",
globals: globals.nodeBuiltin,
},
},
];Linting ciente de tipos com um tsconfig dedicado:
{
files: ["**/*.ts"],
languageOptions: {
parserOptions: {
project: "./tsconfig.eslint.json",
tsconfigRootDir: import.meta.dirname,
},
},
}Integração com Prettier (desativa regras estilísticas que entram em conflito):
npm install --save-dev eslint-config-prettierimport prettier from "eslint-config-prettier";
export default tseslint.config(
js.configs.recommended,
...tseslint.configs.recommended,
prettier, // deve ser o ÚLTIMO - desabilita regras estilísticas conflitantes
);Ignores com escopo para arquivos gerados:
{
ignores: ["**/*.generated.ts", "src/proto/**"],
}@typescript-eslint/parser é instalado transitivamente através do meta-pacote typescript-eslint - você raramente precisa importá-lo diretamente.no-floating-promises e no-misused-promises são essenciais para scripts Node.js onde rejeições não tratadas silenciosas podem corromper o estado....tseslint.configs.strictTypeChecked - ele captura bugs reais como no-unnecessary-condition e no-unsafe-argument.tseslint.config() fornece autocompletar e erros de tipo se você errar o nome de uma regra ou opção.Coisas que vão te morder. Cada armadilha inclui o que dá errado, por que acontece e a correção.
Confusão entre Flat config e .eslintrc legado - ESLint 9+ usa flat config por padrão. Se você ainda tem um .eslintrc.json no projeto, o ESLint o ignora silenciosamente quando eslint.config.js existe. Correção: Exclua todos os arquivos legados ao migrar e verifique com npx eslint --print-config path/to/file.ts.
parserOptions.project ausente desabilita regras cientes de tipos - Regras de strictTypeChecked ou stylisticTypeChecked exigem que o programa TypeScript seja carregado. Sem project, elas falham em tempo de execução ou passam silenciosamente. Correção: Sempre defina parserOptions.project e tsconfigRootDir no bloco de arquivos TS.
eslint-plugin-n relata falsos positivos para aliases de caminho TS - Regras como n/no-missing-import não conseguem resolver aliases de caminho @/utils definidos em tsconfig.json. Correção: Desabilite n/no-missing-import (e n/no-unpublished-import) ao usar TypeScript - typescript-eslint já valida imports.
Arquivo de configuração ESM em um projeto CommonJS - Se package.json tiver "type": "commonjs" (ou nenhum campo type), eslint.config.js com sintaxe import falha ao carregar. Correção: Renomeie para eslint.config.mjs OU adicione "type": "module" a package.json.
Conflitos de regras Prettier/ESLint - Habilitar regras estilísticas do ESLint junto com o Prettier produz auto-correções conflitantes. Correção: Adicione eslint-config-prettier como o último item no array de configuração para desabilitar regras conflitantes.
ignores misturado com outras chaves se torna silenciosamente um filtro de arquivo - Em flat config, um objeto com ignores e rules é tratado como um filtro, não como um ignore global. Correção: Coloque ignores globais em seu próprio objeto { ignores: [...] } sem outras chaves.
Outras maneiras de resolver o mesmo problema - e quando cada uma é a melhor escolha.
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Biome | Você quer uma única ferramenta rápida baseada em Rust para lint + format | Você precisa do ecossistema completo de plugins ESLint ou regras personalizadas |
| oxlint | Você quer velocidade extrema e está OK com um subconjunto de regras | Você depende de regras cientes de tipos (ainda não suportado) |
| Deno lint | Você está executando scripts no Deno, não no Node | Você tem como alvo o Node.js |
standard | Você quer zero configuração, padrões opinativos | Você precisa personalizar qualquer regra |
eslint-plugin-node não é mais mantido.eslint-plugin-n é o fork mantido pela comunidade com suporte a flat config.n/ (por exemplo, n/no-missing-import).typescript-eslint agrupa o parser e o plugin.typescript-eslint e use tseslint.config() - ele conecta ambos.parserOptions.project para o caminho do seu tsconfig.json.parserOptions.tsconfigRootDir para import.meta.dirname....tseslint.configs.strictTypeChecked (ou recommendedTypeChecked).project, as regras cientes de tipos ou dão erro ou passam silenciosamente.no-floating-promises captura chamadas await esquecidas.no-misused-promises evita passar funções assíncronas onde callbacks síncronos são esperados.no-unsafe-argument captura any vazando de dependências não tipadas.package.json para "type". Se for commonjs ou ausente, renomeie a configuração para eslint.config.mjs ou adicione "type": "module"..eslintrc legados são ignorados quando uma flat config existe.npx eslint --print-config somefile.ts para ver qual configuração está realmente sendo carregada.n/no-missing-import não consegue resolver aliases de caminho TypeScript como @/lib/foo.n/no-missing-import e n/no-unpublished-import em projetos TypeScript.typescript-eslint já verifica imports através do compilador TypeScript.tseslint.config() - ele fornece autocompletar completo e erros de tipo.// @ts-check com JSDoc @type \{import("eslint").Linter.Config[]\}.eslint.config.ts nativamente.recommendedTypeChecked é a linha de base segura - captura bugs sem ser muito rigorosa.strictTypeChecked adiciona regras mais rigorosas como no-unnecessary-condition e prefer-reduce-type-parameter.files: ["scripts/**/*.ts"] e substitua as regras dentro dele.eslint-config-prettier apenas desabilita regras estilísticas que entram em conflito com o Prettier.files: ["**/*.js"] e outro com files: ["**/*.ts"]..ts para evitar erros em arquivos JS puros.@typescript-eslint/no-floating-promises para capturar promises não tratadas.@typescript-eslint/no-misused-promises para incompatibilidades de callback.@typescript-eslint/return-await definido como "always" para stack traces mais limpas.Revisado por Chris St. John·Última atualização: 10 de jul. de 2026
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥