Skip to content

Oxlint JS Plugins Alpha


Os plugins JavaScript para o Oxlint chegaram ao alpha — e esperamos que cerca de 80% dos usuários do ESLint possam migrar para o Oxlint e “simplesmente funcionar”.

O Oxlint já implementa mais de 650 regras populares em Rust, em velocidade nativa. Os plugins JS preenchem lacunas: uma API compatível com o ESLint, permitindo rodar plugins existentes e escrever regras próprias, tudo no Oxlint. Desempenho nativo na maior parte das regras; flexibilidade total no restante.

Desde a primeira prévia técnica no ano passado, cobrimos quase toda a API de plugins do ESLint, adicionamos suporte a plugins TypeScript, autofix, integração com IDE e grandes ganhos de desempenho.

Assim, muitas equipes podem trocar o ESLint pelo Oxlint sem reescrever as regras de lint.

Este alpha marca o ponto em que consideramos os plugins JS prontos para adoção em projetos reais.

Na maioria dos projetos, o Oxlint deve poder substituir o ESLint com migração direta e redução forte no tempo de lint.

Recursos

  • Executar a maioria dos plugins do ESLint sem alterações.
  • Escrever regras próprias em JavaScript ou TypeScript.
  • Obter autofix e suggestions de regras de plugins JS.
  • Ver diagnósticos de plugins JS ao vivo na IDE via language server.

Quão confiável é?

O suporte a plugins JS do Oxlint é testado com a suíte completa de testes do próprio ESLint e com uma seleção ampla de plugins, incluindo:

PluginTestesTaxa
Regras embutidas do ESLint33.006100%
React hooks (incl. regras do React Compiler)5.007100%
ESLint Stylistic18.31099,99%
Testing Library17.016100%
SonarJS3.95199,6%*
e18e474100%*

* exceto regras dependentes de tipo

Se um plugin não está na lista, provavelmente ainda funciona — só ainda não entrou na nossa suíte de conformidade.

Os testes do ESLint cobrem toda a superfície da API; 100% de aprovação nos dá confiança em casos de borda e no fluxo feliz. Experimente e nos conte!

O Oxlint já roda em produção em várias empresas e projetos, entre eles Midjourney, Preact, Posthog, Outline e Actual.

O que ainda não faz

  • Suporte limitado a formatos próprios de frameworks front-end (p.ex. Svelte, Vue, Angular) — mais adiante neste ano.
  • Sem regras customizadas dependentes de tipo (regras do TypeScript-ESLint já vêm no Oxlint via lint com reconhecimento de tipos).
  • Alguns usuários relatam experiência abaixo do ideal no Windows. Erros de memória são um problema conhecido, em especial no Windows. Estamos trabalhando nisso. Enquanto isso, se isso ocorrer, recomendamos rodar o Oxlint no WSL, se for viável.

Acompanhe o progresso na issue de acompanhamento.

Primeiros passos

Instale oxlint como dev dependency:

sh
pnpm add -D oxlint

Adicione um script ao package.json:

package.json
json
{
  "scripts": {
    "lint": "oxlint"
  }
}

Crie um arquivo de config (ou use nossa ferramenta de migração):

.oxlintrc.json
json
{
  "jsPlugins": ["eslint-plugin-testing-library"],
  "rules": {
    "testing-library/no-render-in-lifecycle": "error"
  }
}

Lint no projeto:

sh
pnpm run lint

Migrando do ESLint

Para a maioria dos projetos, migrar do ESLint é simples.

O caminho mais direto é a ferramenta @oxlint/migrate.

sh
npx @oxlint/migrate eslint.config.js

Ou peça ao seu agente de código com a skill migrate-oxlint.

Veja o guia de migração para mais detalhes.

Regras do ESLint

O Oxlint já implementa nativamente a maior parte das regras embutidas do ESLint, reescritas em Rust, mas ainda não todas.

Para preencher a lacuna, oferecemos oxlint-plugin-eslint, com todas as regras embutidas do ESLint empacotadas como plugin JS do Oxlint.

Isso libera regras como no-restricted-syntax, ainda sem implementação nativa.

.oxlintrc.json
jsonc
{
  "jsPlugins": ["oxlint-plugin-eslint"],
  "rules": {
    // Note: "eslint-js" not "eslint"
    "eslint-js/no-restricted-syntax": [
      "error",
      {
        "selector": "ThrowStatement > CallExpression[callee.name=/Error$/]",
        "message": "Use `new` keyword when throwing an `Error`.",
      },
    ],
  },
}

O Oxlint também implementa nativamente um subconjunto de regras de plugins como eslint-plugin-jsdoc. Para regras que ainda não existem no Oxlint, use o pacote eslint-plugin-jsdoc diretamente. Padrão recomendado:

.oxlintrc.json
jsonc
{
  "jsPlugins": [
    // Set up an alias for the plugin "jsdoc-js"
    { "name": "jsdoc-js", "specifier": "eslint-plugin-jsdoc" },
  ],
  "rules": {
    // Use the alias to refer to rules from the plugin
    "jsdoc-js/check-examples": "error",
    "jsdoc-js/require-description": "error",
    // Use plain "jsdoc" for rules which Oxlint implements natively
    "jsdoc/require-property-name": "error",
    "jsdoc/require-property-description": "error",
  },
}

Desempenho

Desde a primeira prévia, “rustificamos” grandes trechos do código dos plugins JS, com ganhos significativos de desempenho. Em especial, plugins que usam APIs de tokens (p.ex. ESLint Stylistic) ficaram até 5× mais rápidos.

Como benchmark, migramos o repositório do Node.js de ESLint para Oxlint. O Node.js é grande, com muitas regras customizadas e vários plugins pesados do ESLint (98 regras JS no total).

LinterTempoGanho
ESLint1 minuto, 43 s
Oxlint21 s4,8×
Detalhes

INFO

  • Repositório do benchmark

  • 6298 arquivos lintados

  • 104 regras Oxlint embutidas (Rust)

  • 75 regras de plugins JS (JS)

  • 23 regras customizadas (JS)

  • Medido em Mac Mini M4, 48 GB RAM, Node.js 24.14.0

  • Benchmark ESLint:

sh
git checkout bench-eslint
npm ci
hyperfine -i --warmup 1 --runs 5 "node --run eslint"
  • Benchmark Oxlint:
sh
git checkout bench-oxlint
npm ci
hyperfine -i --warmup 1 --runs 5 "node --run oxlint"

Projetos que usam TypeScript-ESLint ou eslint-plugin-import tendem a ver ganhos muito maiores. Um usuário no nosso Discord relatou aceleração de 16× ao lintar a base de ~2 milhões de linhas da empresa ao trocar ESLint por Oxlint, com uso intenso de plugins JS. Projetos com uso mais parcimonioso de plugins JS relataram ganhos de até 100×.

Próximas melhorias de desempenho

Isso é só o começo!

Mesmo com plugins JS, o Oxlint já é bem mais rápido que o ESLint, e temos muitas otimizações na fila.

A chave do desempenho dos plugins JS no Oxlint é um mecanismo novo, muito otimizado e de baixo nível para comunicação Rust ↔ JS, que chamamos de “raw transfer”.

A fronteira Rust/JS sempre foi o problema central para ferramentas nativas com plugins JS. O código nativo é rápido, mas o custo de ir e voltar com dados pode ser tão alto que anula o ganho — resultando em desempenho mediano.

O raw transfer reduz quase a zero o custo de mover dados entre Rust e JS, permitindo que código nativo e plugins JS trabalhem bem juntos.

A primeira iteração do raw transfer já está em uso no Oxlint, mas só começamos a explorar o potencial. À medida que avançarmos, esperamos novo salto de desempenho, aproximando plugins JS da velocidade nativa em Rust.

Para mergulhar nos detalhes, @overlookmotel do core do Oxc deu uma palestra na ViteConf 2025 sobre o tema.

Em resumo: o Oxlint já é o linter JS/TS mais rápido que existe. E vai ficar bem mais rápido.

Dica de desempenho 1: use um formatador

Recomendamos fortemente deixar de usar o linter para formatação e passar a usar o Oxfmt (ou o formatador de sua preferência), se possível.

O Oxfmt é cerca de 30× mais rápido que o Prettier e reduz muito o tempo de lint em relação a plugins como o ESLint Stylistic.

Oxlint e Oxfmt formam um time muito forte!

Dica de desempenho 2: escolha plugins com critério

Ao contrário do que muitos pensam, é perfeitamente possível escrever JavaScript extremamente eficiente. O Oxlint não é rápido só por ser Rust — também foi desenhado com foco em desempenho.

O código dos próprios plugins JS não está sob nosso controle. Bom desempenho geral exige que os plugins escolhidos também se comportem bem.

Se um plugin usa algoritmos ineficientes ou muita E/S em disco, será lento no ESLint e no Oxlint. O que o Oxlint pode fazer é oferecer parser rápido e APIs eficientes — não transformar JS lento em mágica.

No futuro, queremos oferecer uma utilidade para diagnosticar quais plugins/regras são gargalos, se o lint não estiver tão rápido quanto você gostaria.

Criando plugins customizados

Se o projeto tiver necessidades específicas, criar um plugin JS para o Oxlint é simples.

Veja o guia de plugins JS.

FAQ

O Oxlint roda plugins do ESLint? Sim. A maioria funciona sem alterações.

O Oxlint é mais rápido que o ESLint? Sim. Benchmarks costumam mostrar ganhos de cerca de 4× a 100×.

Posso migrar aos poucos? Sim. Dá para rodar Oxlint junto com o ESLint.

Agradecimentos

Chegar a este marco com plugins JS foi trabalho de muitas pessoas. Em especial, agradecemos:

  • @Sysix pelo trabalho incansável na integração com o language server.
  • @lilnasy por expandir muitas das APIs.

Entre na comunidade

Queremos seu feedback sobre plugins JS no Oxlint e ver como isso melhora seu fluxo de trabalho.

Onde nos encontrar: