BookinglyTech News
Software

oxlint linta el núcleo de Vue en 0,9 s con reglas tipadas frente a los 12 s de ESLint

Una prueba sobre 445 ficheros TypeScript del repositorio de Vue mide el linter de VoidZero cinco veces más rápido que ESLint incluso cuando hace el análisis que necesita el comprobador de tipos.

3 min de lecturaDev.to0 vistas

oxlint, el linter de JavaScript y TypeScript que VoidZero —la empresa que Evan You montó después de Vue y Vite— escribe en Rust, no solo es rápido con las reglas sintácticas. Con el flag --type-aware también gana a ESLint haciendo el trabajo caro: 0,9 segundos frente a los 12 que tarda ESLint 9 con typescript-eslint sobre el mismo árbol de código.

La medición se hizo sobre el repositorio del núcleo de Vue: 445 ficheros TypeScript, unas 150.000 líneas, en un contenedor limpio con Node 20. Cuatro configuraciones sobre los mismos ficheros, con la mediana de varias pasadas como resultado.

Herramienta Modo Tiempo
ESLint 9 recommended (sintáctico) 4,4 s
ESLint 9 recommendedTypeChecked (con tipos) 12 s
oxlint por defecto (sintáctico) 0,24 s
oxlint --type-aware 0,9 s

Con las reglas sintácticas la diferencia es de unas dieciocho veces, y aun así se queda corta. oxlint imprime al final de cada ejecución el tiempo de su propio motor, y en este código fueron 75 milisegundos. El resto es arranque de Node y npx resolviendo el binario. Es la diferencia entre un linter que puedes colgar de un hook de pre-commit y otro que vive en el job de CI y cruzas los dedos para que termine.

El supuesto que no aguantó

El relato cómodo era que oxlint es rápido porque se salta el análisis tipado: primera pasada barata y a ESLint lo caro. El flag --type-aware existe y ejecuta esas reglas a través de un compañero llamado tsgolint. En el mismo código, 0,9 segundos. Trece veces menos que ESLint haciendo la misma clase de trabajo, y todavía cinco veces menos que la pasada sintáctica de ESLint. Las reglas que la gente usa de verdad —no-floating-promises, no-misused-promises, await-thenable— entran ahí, y todas necesitan saber qué tipo tiene cada valor.

El matiz importante: tsgolint es un comprobador de tipos de TypeScript escrito en Go, no es tsc. Esa reimplementación es justo el motivo de que vaya rápido, y también el motivo para probarlo contra tu propio código antes de meterlo en CI.

Lo que hay que mirar antes de migrar

Los conjuntos de reglas no son idénticos. Los recommended de ESLint y los de oxlint se solapan mucho, pero no son la misma lista, así que la comparación mide tiempo hasta un estándar parecido, no las mismas comprobaciones byte a byte. En la pasada sintáctica oxlint reportó 96 reglas activas; con análisis de tipos, 111. Si dependes de una regla concreta de ESLint o de un plugin propio, oxlint puede no tenerla, y ningún número de velocidad salva una regla que falta.

El modo tipado tampoco es gratis de arrancar: está detrás de un flag, tira de un paquete aparte (oxlint-tsgolint) y el propio proyecto lo etiqueta como experimental. Sin ese paquete falla con un mensaje limpio que dice qué instalar, que es el comportamiento correcto, pero sigue siendo un paso manual y no el comportamiento por defecto.

Lo relevante para quien mantiene un frontend grande es dónde se nota: el hook de pre-commit al que todo el mundo acaba añadiendo --no-verify para poder trabajar, y el minuto de runner que se va en cada push. Con tiempos por debajo del segundo, revisar deja de ser algo que se esquiva. Con la salvedad de que las reglas tipadas las aplica una implementación distinta de la oficial, y eso se comprueba en tu repositorio, no en el de Vue.