Javi Moreno
Oxlint: El Linter JavaScript que Revoluciona el Performance - Guía Completa 2025

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ísticaOxlintESLint
Velocidad50-100x más rápidoBaseline
Reglas500+ reglas300+ reglas base
PluginsLimitado (en desarrollo)Ecosistema extenso
ConfiguraciónSimplificadaMuy flexible
MemoriaUso eficienteUso intensivo
InstalaciónBinario únicoMúltiples dependencias

Oxlint vs Biome

CaracterísticaOxlintBiome
EnfoqueSolo lintingLinting + Formatting
VelocidadExtremadamente rápidoMuy rápido
CompatibilidadESLint compatiblePropio estándar
AdopciónFácil migraciónRequiere reconfiguración
ComunidadCrecienteEstablecida

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

  1. Proyectos Nuevos: Usar Oxlint desde el inicio para máximo beneficio
  2. Migración Gradual: Implementar junto con ESLint durante transición
  3. Equipos Grandes: Especialmente beneficioso para proyectos colaborativos
  4. 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