oxlint y oxfmt: linter y formateador a velocidad de Rust
oxlint recorre en segundos lo que ESLint tarda minutos en revisar —entre 50 y 100 veces más rápido— y oxfmt formatea unas 30 veces más rápido que Prettier con una salida compatible. Dos piezas de Oxc que reutilizan su AST y que puedes adoptar sin fricción, incluso junto a las herramientas que ya usas.
Dentro de la familia Oxc hay dos piezas que puedes usar hoy, sin reescribir tu proyecto ni esperar a Vite 8: oxlint, el linter, y oxfmt, el formateador. La cifra que las define impresiona: oxlint es entre 50 y 100 veces más rápido que ESLint, y oxfmt unas 30 veces más rápido que Prettier. Pero lo verdaderamente interesante no es el número, sino de dónde sale y por qué te permite migrar sin fricción. Esta lección disecciona ambas herramientas y la estrategia de adopción que las hace irresistibles.
- Presentar
oxlintcomo linter entre 50 y 100 veces más rápido queESLint. - Presentar
oxfmtcomo formateador unas 30 veces más rápido quePrettier. - Explicar de dónde sale esa velocidad: Rust, multihilo y el AST de
Oxc. - Mostrar cómo adoptarlos sin fricción, incluso junto a
ESLintyPrettier.
oxlint: el linter que cabe en un guardado
Un linter analiza tu código en busca de errores probables y malas prácticas: variables sin usar, promesas sin await, comparaciones sospechosas, dependencias mal declaradas en un hook. ESLint hace ese trabajo desde hace más de una década y es una pieza magnífica, pero su coste creció con los proyectos: en un monorepo grande, una pasada completa puede llevar minutos, y por eso se relega a la integración continua en vez de correr en cada guardado.
oxlint cambia la ecuación. Trae cientos de reglas integradas —muchas portadas desde los plugins más populares de ESLint—, arranca sin configuración y recorre bases de código enormes en segundos. Es tan rápido que deja de tener sentido reservarlo para el CI: puedes ejecutarlo en cada guardado, en un hook de pre-commit o al vuelo mientras editas, sin notar la espera.
# oxlint corre sobre tu codigo tal cual, sin configurar nada
npx oxlint@latest
# o acotado a una carpeta, con correcciones automaticas donde las haya
npx oxlint@latest src --fix
Por defecto se centra en reglas de correctitud —las que cazan bugs reales, no las meramente estilísticas— para que su salida sea señal y no ruido. Esa elección no es casual: un linter que tarda segundos y solo grita cuando importa se convierte en un compañero constante, mientras que uno lento y ruidoso acaba silenciado. Lo que ESLint te da en minutos, oxlint te lo da antes de que sueltes la tecla.
Sus reglas se agrupan en categorías reconocibles para quien viene de ESLint: correctness para los bugs casi seguros, suspicious para los patrones dudosos, y pedantic o style para el resto. Muchas provienen de los plugins más usados del ecosistema —el de React, el de TypeScript, el de importaciones—, reimplementadas sobre el AST de Oxc. Ajustarlas se hace con un archivo de configuración opcional, pero el valor está en que, sin tocar nada, ya cubre el grueso de lo que de verdad rompe un proyecto. Algunos ejemplos de lo que caza sin que se lo pidas:
- Variables e imports declarados y nunca usados.
- Promesas sin
awaity efectos con dependencias mal listadas. - Comparaciones con
==donde casi seguro querías===. - Claves duplicadas en un objeto o ramas inalcanzables en un
switch. - Uso de
letdonde nunca se reasigna el valor, o devaren código moderno. - Igualdad laxa y conversiones implícitas que suelen esconder un error.
oxfmt: formatear deja de tener coste
oxfmt es el formateador de la familia, y su gran acierto es una decisión de compatibilidad: produce una salida compatible con el estilo de Prettier. Eso significa que adoptarlo no reescribe todo tu proyecto con otro formato ni genera un diff gigantesco que sepulte los cambios reales. El código queda prácticamente igual que con Prettier, pero formatearlo cuesta una fracción del tiempo: unas 30 veces menos.
# oxfmt formatea con un estilo compatible con Prettier, a velocidad de Rust
npx oxfmt@latest
# comprobar sin escribir, ideal para el CI
npx oxfmt@latest --check
La compatibilidad de estilo es una renuncia deliberada y astuta: oxfmt podría haber impuesto sus propias opiniones sobre comas o saltos de línea, pero eso habría convertido cada adopción en una guerra de diffs. Al imitar a Prettier, elimina el único motivo real para no probarlo. Y, como oxlint, su velocidad lo vuelve invisible: formatear al guardar deja de ser una micro-pausa perceptible y pasa a ser instantáneo.
Hay una razón más honda para que el formateo sea opinado y no configurable hasta el último detalle, y oxfmt la hereda de Prettier: un formateador sin apenas opciones elimina las discusiones de estilo del equipo. Si nadie puede ajustar la coma final ni la anchura de línea, nadie discute sobre ellas, y el formato deja de ser un tema en las revisiones. oxfmt conserva esa filosofía y le añade la velocidad que faltaba.
En la práctica, esto significa que puedes borrar el formateo de tu lista de tareas: se vuelve un efecto automático del guardado, tan invisible como fiable, y las revisiones dejan de gastarse en comas y sangrías para centrarse en lo que de verdad importa.
De dónde sale la velocidad
Las dos cifras —50 a 100 veces, 30 veces— no salen de trucos, sino de la misma raíz que viste con Oxc. ESLint y Prettier son programas en JavaScript, de un solo hilo, que parsean tu código con su propio parser antes de trabajar. oxlint y oxfmt están escritos en Rust, reparten el trabajo entre todos los núcleos de tu máquina y, sobre todo, reutilizan el AST de Oxc: parsean una vez con el parser más rápido del ecosistema y aplican las reglas o el formateo sobre ese árbol, sin releer el texto.
flowchart LR subgraph ESLint_y_Prettier e1[JavaScript en un solo hilo] --> e2[Reparsea con su propio parser] e2 --> e3[Minutos en un monorepo] end subgraph oxlint_y_oxfmt o1[Rust y multihilo] --> o2[Reutiliza el AST de Oxc] o2 --> o3[Segundos en el mismo monorepo] end style e3 fill:#f38ba8,color:#11111b style o3 fill:#a6e3a1,color:#11111b
Multiplica esos tres factores —lenguaje nativo, paralelismo real y una sola pasada de parseo— y el orden de magnitud deja de sorprender: es la consecuencia aritmética de no repetir trabajo y no pagar el peaje de la interpretación. No hay una regla secreta que oxlint aplique más rápido; simplemente no desperdicia el tiempo que sus predecesores gastaban en reparsear en un solo hilo.
Desglosado, el salto viene de tres multiplicadores que se acumulan:
- Lenguaje nativo: Rust compilado, sin el peaje de interpretar JavaScript con JavaScript.
- Paralelismo real: el trabajo se reparte entre todos los núcleos, no se encola en un hilo.
- Una sola pasada: se parsea una vez con el parser de
Oxcy se reutiliza el árbol.
Ninguno de los tres es un truco; los tres juntos explican el factor de 50 a 100. Y como el mismo árbol alimenta al formateador, oxfmt disfruta de la misma aritmética: por eso ambas cifras, la del linter y la del formateador, tienen exactamente el mismo origen.
oxlint
Linter en Rust, entre 50 y 100 veces más rápido que ESLint. Cientos de reglas integradas, cero configuración para empezar.
oxfmt
Formateador en Rust, unas 30 veces más rápido que Prettier, con salida compatible para que migrar no reformatee todo.
Coexistencia
Puedes correr oxlint como primer filtro veloz y dejar a ESLint las reglas que aún no cubre. Adopción gradual.
Migrar sin fricción
La velocidad abre la puerta, pero lo que hace irresistible a este par es la ausencia de fricción para adoptarlos. oxlint corre sobre tu código actual sin configurar nada: puedes incorporarlo hoy como un primer filtro rapidísimo en el pre-commit o en el CI, y mantener ESLint para las reglas que oxlint todavía no cubre —el análisis que depende de tipos y los plugins personalizados—. Ambos conviven, y a medida que el catálogo de reglas de oxlint crece, el papel de ESLint se encoge.
oxfmt juega la misma carta desde el lado del formato: como su salida es compatible con Prettier, cambiar de uno a otro no provoca la avalancha de cambios que temerías. La adopción es incremental y reversible; no hay que apostar todo de golpe. Un camino de migración sensato en 2026 se parece a esto:
- Semana uno: añade
oxlintcomo primer paso del pre-commit, delante deESLint. Coste cero, ganancia inmediata de latencia. - Semana dos: activa
oxfmt --checken el CI junto aPrettiery comprueba que el diff es mínimo. - Después: ve trasladando reglas de
ESLintaoxlintsegún las vaya cubriendo, y reduce la superficie de las herramientas lentas.
La clave de que este camino funcione es que cada paso es reversible y no bloquea a los demás: si oxlint marca un falso positivo, lo silencias y sigues; si oxfmt te incomoda en un archivo, vuelves a Prettier para ese caso. Nada de esto exige una decisión irreversible ni una reescritura de fin de semana, que es justo lo que hace que un equipo se atreva a empezar.
# Estrategia sin friccion: oxlint como filtro rapido en pre-commit
# y ESLint solo para las reglas type-aware que aun no cubre
npx oxlint@latest && npx eslint . --rulesdir ./reglas-type-aware
En un proyecto real, esto se cablea en los scripts para que nadie tenga que recordarlo:
// package.json: oxlint y oxfmt como primera linea, rapida
{
"scripts": {
"lint": "oxlint",
"format": "oxfmt",
"check": "oxlint && oxfmt --check"
}
}
Sé honesto sobre los límites actuales. oxlint no reimplementa todavía cada regla de ESLint, y su análisis type-aware —el que necesita el verificador de tipos de TypeScript— está en desarrollo. Los plugins muy específicos de ESLint tampoco tienen equivalente directo. Por eso la recomendación de 2026 no es reemplaza ESLint de golpe, sino pon oxlint delante como filtro veloz y conserva ESLint para lo que aún solo él sabe hacer. La brecha se estrecha versión a versión, pero la coexistencia es hoy la vía sensata.
Hay una lección estratégica escondida en oxlint y oxfmt que vale más que sus cifras, y es esta: una herramienta mejor no gana por ser mejor, gana por ser mejor y barata de adoptar. La historia del tooling está llena de reemplazos técnicamente superiores que nunca despegaron porque migrar a ellos costaba una reescritura, una reconfiguración o un diff imposible de revisar. oxlint y oxfmt fueron diseñados con la fricción como enemigo principal, no como una consideración secundaria. oxlint corre sin configuración sobre tu código tal cual, así que probarlo cuesta un comando y cero compromiso. oxfmt imita deliberadamente el estilo de Prettier, renunciando a imponer sus propias opiniones, para que cambiar de formateador no te obligue a reformatear el mundo. Y ninguno te pide abandonar lo que ya usas: se sientan al lado de ESLint y Prettier como un primer filtro veloz, y van comiendo terreno a medida que maduran. Esa es la jugada maestra, y deberías reconocerla cuando la veas en cualquier dominio: no intentes desalojar al titular con un ultimátum de migra o quédate atrás, sino ofrécete como un complemento sin coste que resuelve el 90 por ciento de los casos hoy y el resto mañana. Interiorizar esto te cambia como ingeniero: dejas de evaluar una herramienta solo por lo buena que es y empiezas a evaluarla por el producto de su calidad y lo indoloro de adoptarla. La velocidad de Rust abrió la puerta; la obsesión por la compatibilidad es lo que hará que la cruces sin darte cuenta.
- Ejecuta
npx oxlint@latesten un proyecto real y cronométralo: compáralo con lo que tarda tuESLintactual sobre el mismo código. - Lanza
npx oxfmt@latest --checky comprueba cuántos archivos cambiaría; verás que, al ser compatible conPrettier, el diff es mínimo. - Añade
oxlintcomo primer paso de tu hook de pre-commit, delante deESLint, y siente la diferencia de latencia al confirmar. - Localiza una regla type-aware o un plugin de
ESLintqueoxlintno cubra aún: ese es el motivo concreto por el que hoy conviven. - Explica en dos frases por qué reutilizar el AST de
Oxcy correr en multihilo produce el salto de minutos a segundos.