Melhores Práticas de Linting
Um resumo condensado das 25 melhores práticas mais importantes extraídas de todas as páginas desta seção.
Busque em todas as páginas da documentação
Um resumo condensado das 25 melhores práticas mais importantes extraídas de todas as páginas desta seção.
Comece com eslint-config-expo: npx expo lint cria a configuração plana - não copie cegamente um .eslintrc de 2019 de um repositório web.
Use ESLint flat config em novos projetos: eslint.config.js com eslint-config-expo/flat - o eslintrc legado é um imposto de migração, não um recurso.
Execute lint em package.json: expo lint ou eslint . - todo PR executa o mesmo comando localmente e em CI.
Separe Prettier de ESLint: Formate com Prettier; faça lint com ESLint - eslint-config-prettier evita conflitos de regras.
Ordene imports com um plugin Prettier: @ianvs/prettier-plugin-sort-imports - a ordem consistente de imports é melhor do que discussões em revisão.
Estenda expo/tsconfig.base antes de strict: A base oficial inclui configurações de paths e JSX - flags strict são camadas sobre uma base funcional.
Habilite strict incrementalmente: noImplicitAny por pasta é melhor do que um muro de mil erros - acompanhe o progresso em um ADR vivo.
Adicione noUncheckedIndexedAccess deliberadamente: Captura bugs params[0] em código de roteador - habilite após a limpeza de nulidade em utilitários compartilhados.
Execute tsc --noEmit em CI: Tipos não são opcionais em mobile - ESLint não substitui o compilador.
Instale eslint-plugin-react-hooks: rules-of-hooks e exhaustive-deps são inegociáveis - código mobile usa effects para AppState, focus e NetInfo.
Audite exhaustive-deps para focus effects: Callbacks de useFocusEffect precisam de dependências estáveis - closures obsoletos causam buscas duplicadas na troca de abas.
Evite eslint-disable em regras de hooks: Se as dependências são "muito barulhentas", corrija o design do effect - a supressão esconde bugs reais de dados obsoletos.
Proíba console.log em caminhos de produção: no-console com allow: ["warn", "error"] - use um wrapper de logger para níveis de debug.
Forçe props de a11y com eslint-plugin-react-native-a11y: accessibilityLabel em Pressables apenas com ícones - capture em CI, não na revisão da App Store.
Restrinja imports entre features: no-restricted-paths ou limites Nx - features/billing não deve importar features/orders/internals.
Regras locais personalizadas para invariantes da organização: Pequenos plugins createRule para APIs proibidas (AsyncStorage na camada errada) - documente em CONTRIBUTING.
CI executa lint, typecheck, format:check, test: Quatro scripts, um meta-script validate - PRs não são mesclados com sucesso parcial.
Cache ESLint em GitHub Actions: actions/cache em .eslintcache - monorepos precisam de chaves de cache por pacote.
Espelhe gates em EAS Workflows: O mesmo validate antes de eas build - binários nativos não devem ser enviados de branches não lintadas.
Execute Knip em um cronograma: Exports não utilizados e arquivos mortos se acumulam em apps RN com entrypoints do Expo Router - PRs trimestrais do Knip permanecem pequenos.
Combine Knip com depcheck: Knip encontra código não utilizado; depcheck encontra dependências não utilizadas no package.json - módulos nativos deixados instalados inflacionam o tempo de prebuild.
Liste entradas do Expo Router no Whitelist do Knip: Rotas app/** são dinâmicas - configure padrões entry ou falsos positivos bloqueiam a adoção.
Política de zero avisos com uma lista de expiração: Novos avisos falham na CI; avisos legados têm IDs de ticket - velocidade sem dívida infinita.
Auto-fix ao salvar no editor, verificação completa na CI: Desenvolvedores obtêm feedback rápido; CI permanece autoritária - não pule a CI porque "parecia bom localmente".
Documente supressões com comentários de porquê: eslint-disable-next-line requer uma justificativa de uma linha - @ts-expect-error é preferível a @ts-ignore pela mesma razão.
format:check da CI é a camada de aplicação.src/ e features/ novos.Versões da Stack: Esta página foi escrita para React 19.2.3, React Native 0.86.0 e Expo SDK 57 (
expo~57.0.4).
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026