Oxlint: El Linter JavaScript que Revoluciona el Performance - Guía Completa 2025
La llegada de Oxlint marca un punto de inflexión en el mundo del linting de JavaScript, ofreciendo una velocidad sin precedentes que desafía las herramientas tradicionales. Con una mejora de rendimiento de 50-100x sobre ESLint, soporte para más de 500 reglas ESLint y uso en grandes empresas como Shopify, Airbnb y Mercedes-Benz, esta herramienta escrita en Rust está redefiniendo lo que esperamos de un linter moderno.
¿Qué es Oxlint?
Oxlint es un linter de JavaScript y TypeScript de alto rendimiento desarrollado en Rust como parte del proyecto JavaScript Oxidation Compiler (OXC). Su propósito principal es proporcionar una alternativa ultra-rápida a ESLint sin sacrificar funcionalidad ni compatibilidad.
Características Principales
- Performance Extremo: 50-100 veces más rápido que ESLint y escala con el número de núcleos de CPU
- Amplia Compatibilidad: Más de 520 reglas con una lista creciente de eslint, typescript, eslint-plugin-react, eslint-plugin-jest, eslint-plugin-unicorn, eslint-plugin-jsx-a11y y muchas más
- Cero Configuración: Funciona out-of-the-box con configuración sensata por defecto
- Adopción Gradual: Compatible con proyectos existentes de ESLint
- Multiplataforma: Disponible para Windows, macOS y Linux
Instalación y Configuración
Instalación Básica
# Instalación global
npm install -g oxlint
# Instalación en proyecto
npm install --save-dev oxlint
# Con yarn
yarn add --dev oxlint
# Con pnpm
pnpm add -D oxlint
Verificación de Instalación
# Verificar versión instalada
oxlint --version
# Mostrar ayuda
oxlint --help
# Listar todas las reglas disponibles
oxlint --list-rules
Primera Ejecución
# Ejecutar en directorio actual
oxlint .
# Ejecutar en archivos específicos
oxlint src/
# Ejecutar con archivos específicos
oxlint src/**/*.js src/**/*.ts
Configuración Avanzada
Archivo de Configuración
Oxlint admite varios formatos de configuración:
// oxlint.config.js
export default {
rules: {
"no-unused-vars": "error",
"prefer-const": "warn",
"no-console": "off"
},
env: {
browser: true,
node: true,
es2021: true
},
extends: [
"eslint:recommended",
"@typescript-eslint/recommended"
]
};
// .oxlintrc.json
{
"rules": {
"no-unused-vars": "error",
"prefer-const": "warn",
"no-console": "off"
},
"env": {
"browser": true,
"node": true,
"es2021": true
}
}
Configuración en Package.json
{
"name": "mi-proyecto",
"version": "1.0.0",
"oxlint": {
"rules": {
"no-unused-vars": "error",
"prefer-const": "warn"
},
"ignorePatterns": [
"dist/",
"node_modules/",
"*.min.js"
]
},
"scripts": {
"lint": "oxlint .",
"lint:fix": "oxlint . --fix"
}
}
Migración desde ESLint
Análisis de Compatibilidad
# Verificar compatibilidad con configuración existente
oxlint --eslint-config .eslintrc.js
# Ejecutar junto con ESLint para comparar
oxlint . && eslint .
# Mostrar diferencias en reglas
oxlint --compare-with-eslint
Configuración Híbrida
Durante la migración, puedes usar ambos linters:
{
"scripts": {
"lint": "oxlint . && eslint .",
"lint:oxlint": "oxlint .",
"lint:eslint": "eslint .",
"lint:fix": "oxlint . --fix && eslint . --fix"
}
}
Mapeo de Reglas Comunes
// Equivalencias ESLint → Oxlint
const ruleMapping = {
// ESLint Core
"no-unused-vars": "no-unused-vars",
"prefer-const": "prefer-const",
"no-var": "no-var",
// TypeScript
"@typescript-eslint/no-unused-vars": "no-unused-vars",
"@typescript-eslint/prefer-readonly": "prefer-readonly",
// React
"react/jsx-uses-react": "react/jsx-uses-react",
"react/jsx-uses-vars": "react/jsx-uses-vars",
// Import
"import/no-unused-modules": "import/no-unused-modules"
};
Integración con Herramientas de Desarrollo
Visual Studio Code
Instala la extensión oficial de Oxc:
// .vscode/settings.json
{
"oxc.enable": true,
"oxc.configFile": "oxlint.config.js",
"editor.codeActionsOnSave": {
"source.fixAll.oxc": true
},
"oxc.validate": [
"javascript",
"typescript",
"javascriptreact",
"typescriptreact"
]
}
Integración con Webpack
// webpack.config.js
const OxlintWebpackPlugin = require('oxlint-webpack-plugin');
module.exports = {
plugins: [
new OxlintWebpackPlugin({
files: ['src/**/*.{js,ts,jsx,tsx}'],
configFile: 'oxlint.config.js',
failOnError: true,
failOnWarning: false
})
]
};
Integración con Vite
// vite.config.js
import { defineConfig } from 'vite';
import oxlint from 'vite-plugin-oxlint';
export default defineConfig({
plugins: [
oxlint({
include: ['src/**/*.{js,ts,jsx,tsx}'],
exclude: ['node_modules/**'],
configFile: 'oxlint.config.js'
})
]
});
Configuración para Diferentes Proyectos
Proyecto React
// oxlint.config.js
export default {
env: {
browser: true,
es2021: true
},
extends: [
'eslint:recommended',
'plugin:react/recommended',
'plugin:react-hooks/recommended'
],
parserOptions: {
ecmaFeatures: {
jsx: true
},
ecmaVersion: 12,
sourceType: 'module'
},
rules: {
'react/prop-types': 'warn',
'react/jsx-uses-react': 'error',
'react/jsx-uses-vars': 'error',
'react-hooks/rules-of-hooks': 'error',
'react-hooks/exhaustive-deps': 'warn'
}
};
Proyecto TypeScript
// oxlint.config.js
export default {
env: {
browser: true,
node: true,
es2021: true
},
extends: [
'eslint:recommended',
'@typescript-eslint/recommended'
],
parser: '@typescript-eslint/parser',
parserOptions: {
ecmaVersion: 12,
sourceType: 'module'
},
rules: {
'@typescript-eslint/no-unused-vars': 'error',
'@typescript-eslint/explicit-function-return-type': 'warn',
'@typescript-eslint/no-explicit-any': 'warn',
'@typescript-eslint/prefer-readonly': 'error'
}
};
Proyecto Node.js
// oxlint.config.js
export default {
env: {
node: true,
es2021: true
},
extends: [
'eslint:recommended',
'plugin:node/recommended'
],
parserOptions: {
ecmaVersion: 12,
sourceType: 'module'
},
rules: {
'node/no-unsupported-features/es-syntax': 'off',
'node/no-missing-import': 'error',
'node/no-unpublished-import': 'warn',
'prefer-const': 'error',
'no-var': 'error'
}
};
Comandos y Opciones Avanzadas
Opciones de Ejecución
# Ejecutar con corrección automática
oxlint . --fix
# Ejecutar en modo silencioso
oxlint . --quiet
# Mostrar solo errores
oxlint . --quiet --format=compact
# Ejecutar con configuración específica
oxlint . --config custom-config.js
# Ignorar archivos específicos
oxlint . --ignore-pattern "**/*.test.js"
# Ejecutar con formato de salida específico
oxlint . --format json > results.json
Formatos de Salida
# Formato por defecto (stylish)
oxlint .
# Formato compacto
oxlint . --format compact
# Formato JSON
oxlint . --format json
# Formato Unix
oxlint . --format unix
# Formato personalizado
oxlint . --format ./custom-formatter.js
Filtrado de Resultados
# Solo errores
oxlint . --quiet
# Reglas específicas
oxlint . --rule no-unused-vars --rule prefer-const
# Excluir reglas específicas
oxlint . --no-rule no-console
# Filtrar por severidad
oxlint . --max-warnings 10
Rendimiento y Benchmarks
Comparación de Velocidad
# Benchmark en proyecto real
time oxlint src/ # ~0.1s
time eslint src/ # ~5.2s
# Proyecto grande (1000+ archivos)
time oxlint . # ~0.3s
time eslint . # ~45s
Optimización de Performance
// oxlint.config.js - Configuración optimizada
export default {
// Excluir archivos innecesarios
ignorePatterns: [
'node_modules/**',
'dist/**',
'build/**',
'*.min.js',
'coverage/**'
],
// Configurar cache
cache: true,
cacheLocation: '.oxlintcache',
// Optimizar reglas
rules: {
// Solo reglas esenciales para primera pasada
'no-unused-vars': 'error',
'no-undef': 'error',
'prefer-const': 'warn'
}
};
Paralelización
# Aprovechar múltiples núcleos de CPU
oxlint . --parallel
# Especificar número de workers
oxlint . --parallel --max-workers 4
# Mostrar estadísticas de performance
oxlint . --timing
Reglas y Configuración Personalizada
Reglas Más Comunes
// oxlint.config.js - Reglas esenciales
export default {
rules: {
// Posibles errores
'no-unused-vars': 'error',
'no-undef': 'error',
'no-unreachable': 'error',
// Mejores prácticas
'prefer-const': 'warn',
'no-var': 'error',
'eqeqeq': 'error',
// Estilo de código
'indent': ['error', 2],
'quotes': ['error', 'single'],
'semi': ['error', 'always']
}
};
Configuración por Entorno
// oxlint.config.js
export default {
env: {
browser: true,
node: true,
es2021: true,
jest: true
},
overrides: [
{
files: ['**/*.test.js', '**/*.spec.js'],
env: {
jest: true
},
rules: {
'no-console': 'off'
}
},
{
files: ['**/*.config.js'],
env: {
node: true
},
rules: {
'no-console': 'off'
}
}
]
};
Reglas Personalizadas
// custom-rules.js
export default {
'custom-no-todo': {
meta: {
type: 'suggestion',
docs: {
description: 'Disallow TODO comments'
}
},
create(context) {
return {
Program() {
const sourceCode = context.getSourceCode();
const comments = sourceCode.getAllComments();
comments.forEach(comment => {
if (comment.value.includes('TODO')) {
context.report({
node: comment,
message: 'TODO comments are not allowed'
});
}
});
}
};
}
}
};
Integración con CI/CD
GitHub Actions
# .github/workflows/lint.yml
name: Lint Code
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run Oxlint
run: npm run lint
- name: Run Oxlint with JSON output
run: oxlint . --format json > lint-results.json
- name: Upload lint results
uses: actions/upload-artifact@v4
with:
name: lint-results
path: lint-results.json
GitLab CI
# .gitlab-ci.yml
stages:
- lint
- test
- build
lint:
stage: lint
image: node:20
script:
- npm ci
- npm run lint
artifacts:
reports:
junit: lint-results.xml
paths:
- lint-results.json
only:
- merge_requests
- main
Pre-commit Hook
# .husky/pre-commit
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
# Ejecutar oxlint en archivos staged
npx lint-staged
# Alternativa: oxlint directo
oxlint $(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(js|ts|jsx|tsx)$')
// package.json
{
"lint-staged": {
"*.{js,ts,jsx,tsx}": [
"oxlint --fix",
"git add"
]
}
}
Comparación con Otras Herramientas
Oxlint vs ESLint
| Característica | Oxlint | ESLint |
|---|---|---|
| Velocidad | 50-100x más rápido | Baseline |
| Reglas | 500+ reglas | 300+ reglas base |
| Plugins | Limitado (en desarrollo) | Ecosistema extenso |
| Configuración | Simplificada | Muy flexible |
| Memoria | Uso eficiente | Uso intensivo |
| Instalación | Binario único | Múltiples dependencias |
Oxlint vs Biome
| Característica | Oxlint | Biome |
|---|---|---|
| Enfoque | Solo linting | Linting + Formatting |
| Velocidad | Extremadamente rápido | Muy rápido |
| Compatibilidad | ESLint compatible | Propio estándar |
| Adopción | Fácil migración | Requiere reconfiguración |
| Comunidad | Creciente | Establecida |
Oxlint vs Rome/Biome
# Benchmark comparativo (proyecto 1000+ archivos)
time oxlint . # ~0.3s
time biome check . # ~0.8s
time eslint . # ~45s
Casos de Uso Reales
Proyecto E-commerce
// oxlint.config.js - E-commerce
export default {
env: {
browser: true,
node: true,
es2021: true
},
extends: [
'eslint:recommended',
'plugin:react/recommended',
'plugin:security/recommended'
],
rules: {
// Seguridad crítica
'security/detect-object-injection': 'error',
'security/detect-non-literal-fs-filename': 'error',
// Performance
'prefer-const': 'error',
'no-unused-vars': 'error',
// Accesibilidad
'jsx-a11y/alt-text': 'error',
'jsx-a11y/aria-props': 'error'
},
overrides: [
{
files: ['src/pages/checkout/**/*.js'],
rules: {
'no-console': 'error',
'security/detect-object-injection': 'error'
}
}
]
};
Proyecto Microservicios
// oxlint.config.js - Microservicios
export default {
env: {
node: true,
es2021: true
},
extends: [
'eslint:recommended',
'plugin:node/recommended',
'plugin:security/recommended'
],
rules: {
// Node.js específico
'node/no-unsupported-features/es-syntax': 'off',
'node/no-missing-import': 'error',
// Async/await
'prefer-promise-reject-errors': 'error',
'no-async-promise-executor': 'error',
// Logging
'no-console': 'warn'
},
overrides: [
{
files: ['src/services/**/*.js'],
rules: {
'no-console': 'error',
'node/no-process-exit': 'error'
}
},
{
files: ['src/utils/**/*.js'],
rules: {
'complexity': ['error', 10]
}
}
]
};
Solución de Problemas Comunes
Problemas de Configuración
# Verificar configuración
oxlint --print-config src/index.js
# Depurar reglas
oxlint --debug src/
# Verificar archivos ignorados
oxlint --debug --ignore-pattern "**/*.test.js" .
Problemas de Performance
# Verificar archivos procesados
oxlint --debug . | grep "Processing"
# Optimizar ignores
oxlint --timing . --ignore-pattern "node_modules/**" --ignore-pattern "dist/**"
# Usar cache
oxlint --cache --cache-location .oxlintcache .
Problemas de Compatibilidad
// Configuración compatible con ESLint
export default {
// Usar parser compatible
parser: '@babel/eslint-parser',
// Configurar para compatibilidad
parserOptions: {
requireConfigFile: false,
babelOptions: {
presets: ['@babel/preset-env']
}
},
// Mapear reglas ESLint
rules: {
'no-unused-vars': 'error',
'prefer-const': 'warn'
}
};
Mejores Prácticas
Configuración Gradual
// Fase 1: Configuración básica
const phase1 = {
rules: {
'no-unused-vars': 'error',
'no-undef': 'error'
}
};
// Fase 2: Agregar reglas de estilo
const phase2 = {
...phase1,
rules: {
...phase1.rules,
'prefer-const': 'warn',
'no-var': 'error'
}
};
// Fase 3: Configuración completa
const phase3 = {
...phase2,
rules: {
...phase2.rules,
'complexity': ['error', 15],
'max-lines': ['error', 300]
}
};
export default phase3;
Organización de Configuración
// configs/base.js
export const baseConfig = {
env: {
es2021: true
},
extends: ['eslint:recommended']
};
// configs/react.js
export const reactConfig = {
...baseConfig,
env: {
...baseConfig.env,
browser: true
},
extends: [
...baseConfig.extends,
'plugin:react/recommended'
]
};
// configs/node.js
export const nodeConfig = {
...baseConfig,
env: {
...baseConfig.env,
node: true
},
extends: [
...baseConfig.extends,
'plugin:node/recommended'
]
};
Scripts de Automatización
{
"scripts": {
"lint": "oxlint .",
"lint:fix": "oxlint . --fix",
"lint:staged": "lint-staged",
"lint:ci": "oxlint . --format json --output-file lint-results.json",
"lint:watch": "nodemon --exec 'oxlint .' --watch src --ext js,ts,jsx,tsx"
}
}
Futuro y Roadmap
Características Planificadas
Las próximas versiones de Oxlint incluirán optimizaciones de rendimiento adicionales, configuración fine-grained (por-glob) compatible con ESLint v9, y soporte para plugins de JavaScript que permitirán a la comunidad crear extensiones personalizadas.
Adopción Empresarial
Grandes empresas como Shopify, Airbnb y Mercedes-Benz ya están utilizando Oxlint en producción, lo que demuestra su madurez y confiabilidad para proyectos críticos.
Ecosistema en Desarrollo
// Futuras características esperadas
const futureFeatures = {
plugins: {
javascript: true, // Plugins en JavaScript
typescript: true, // Mejor soporte TS
frameworks: ['react', 'vue', 'angular']
},
performance: {
streaming: true, // Análisis en streaming
incremental: true, // Análisis incremental
parallelism: 'auto' // Paralelización automática
},
integration: {
ide: ['vscode', 'webstorm', 'vim'],
bundlers: ['webpack', 'vite', 'rollup'],
frameworks: ['next.js', 'nuxt', 'sveltekit']
}
};
Conclusión
Oxlint representa una evolución significativa en el ecosistema de herramientas de JavaScript, ofreciendo una alternativa ultra-rápida y eficiente a ESLint. Sus principales beneficios incluyen:
🚀 Ventajas Clave
- Performance Excepcional: 50-100 veces más rápido que ESLint
- Facilidad de Adopción: Migración gradual sin disrupciones
- Configuración Simplificada: Menos complejidad, mejores defaults
- Amplia Compatibilidad: Más de 520 reglas soportadas
- Adopción Empresarial: Validado por grandes organizaciones
📈 Impacto en el Desarrollo
- Ciclos de Feedback Más Rápidos: Linting instantáneo durante desarrollo
- Mejor Experiencia de Desarrollador: Menos tiempo esperando, más tiempo creando
- Integración Perfecta: Compatible con herramientas existentes
- Escalabilidad: Performance que no degrada con el tamaño del proyecto
🎯 Recomendaciones
- Proyectos Nuevos: Usar Oxlint desde el inicio para máximo beneficio
- Migración Gradual: Implementar junto con ESLint durante transición
- Equipos Grandes: Especialmente beneficioso para proyectos colaborativos
- CI/CD: Reducir significativamente tiempos de pipeline
Oxlint ofrece una estrategia de adopción pragmática que no requiere migración todo-o-nada, mejorando dramáticamente los ciclos de retroalimentación y la productividad del desarrollador. La herramienta no solo es más rápida, sino que también simplifica la configuración y mantenimiento del linting en proyectos JavaScript modernos.
Recursos Adicionales
- Documentación Oficial: oxc.rs/docs
- Repositorio GitHub: github.com/oxc-project/oxc
- Paquete NPM: oxlint en npm
- Extensión VS Code: Oxc VS Code Extension
- Guía de Migración: oxc.rs/docs/guide/migration
- Comparaciones de Performance: oxc.rs/docs/guide/benchmarks