Decidimos não esperar pelo linter perfeito: migração para o ESLint V9 e adoção híbrida do Biome
(blog.lemonbase.team)Compartilhamos a experiência do chapter de frontend da Lemonbase ao migrar para o ESLint V9 em resposta ao fim do suporte ao ESLint V8 e resolver problemas de desempenho com a adoção híbrida do Biome.
Contexto da adoção
- Em setembro de 2024, foi anunciado o fim do suporte ao ESLint V8, tornando a migração para o V9 indispensável para continuar recebendo patches de segurança e correções de bugs
- A partir do V9, a configuração baseada em
.eslintrc.jsfoi descontinuada, e o Flat Config passou a ser o padrão - Era necessário verificar cerca de 400 regras, uma estrutura de arquivos de configuração dividida em duas partes e a compatibilidade de vários plugins
Processo de migração
- A ferramenta oficial de migração do ESLint ficou aquém do esperado, pois basicamente apenas envolvia a configuração com
@eslint/compat - Um rascunho foi gerado com ferramentas de IA, mas surgiram várias regras omitidas e problemas de compatibilidade
- No fim, foi feita uma revisão completa comparando as regras do V8 e do V9 uma a uma em uma planilha
Problemas de desempenho após a migração
- Depois da atualização para o V9, em vez de melhorar, o tempo ficou 30 segundos mais lento: de 154 s para 184 s
- A regra
import/no-cycleficou 10 vezes mais lenta em relação ao V8, passando a representar 45,8% do total - A regra
prettier/prettiertambém chegou a 10,2%, e a sobrecarga de parsing duplo virou um gargalo
Adoção híbrida do Biome
- Em vez de uma substituição completa, a abordagem mudou para “usar juntos e focar no ganho”
- O
Prettierfoi substituído peloBiome Formatter, reduzindo o tempo de formatação de 14 s para 2 s - O ESLint passou a cuidar apenas das regras customizadas do projeto
Resultado final
- ESLint V8: 154 s → ESLint V9: 184 s
- Apenas ESLint → híbrido Biome + ESLint: ~20 s
O que aprenderam
- Ao delegar a migração para uma IA, é preciso primeiro fazê-la montar um plano, depois revisar com atenção e definir critérios de sucesso com clareza, como por exemplo obter o mesmo resultado do V8
- Em vez de esperar pela ferramenta perfeita, às vezes o caminho mais rápido é combinar bem as ferramentas disponíveis agora
Pontos de atenção
- Ao usar as duas ferramentas juntas, é preciso manter tanto o
eslint.config.mjsquanto obiome.json, e podem surgir conflitos entre regras - É necessário definir claramente qual regra ficará sob responsabilidade de cada ferramenta e explicar essa divisão de papéis durante o onboarding de novos membros da equipe
2 comentários
Parece um texto que pode trazer bons insights para quem ainda está enfrentando problemas de performance de linting.
Nós também tivemos uma experiência parecida no ano passado: ao melhorar nosso setup para usar
oxc(oxlint) e ESLint de forma híbrida, conseguimos reduzir um linting que levava mais de 200 segundos para menos de 15 segundos.No começo, eu também fiz a migração de forma meio bruta usando IA, mas regras omitidas ou alteradas continuavam aparecendo, então cheguei a pensar em revisar uma por uma.
Em vez disso, usei IA para escrever um script que extrai as regras suportadas pelo
oxc, e ajustei o processo para deixar ativadas no ESLint apenas as regras que ooxcnão suporta. Assim, ficou muito mais fácil atualizar periodicamente as novas regras que passam a ser suportadas...No início, esse processo era semiautomatizado, mas agora definimos isso como uma Skill e basta executar com o Claude Code, então a carga também diminuiu bastante, o que foi ótimo.
Em vez de
eslinteprettier, vocês não pensam em usaroxlinteoxfmt?Mantendo um mapeamento de configuração 1 para 1, a velocidade fica no mínimo dezenas de vezes mais rápida