Biome (Alternativa a ESLint + Prettier)
Usa Biome como una única herramienta rápida para linting, formateo y organización de imports - reemplazando ESLint y Prettier.
Busca en todas las páginas de la documentación
Usa Biome como una única herramienta rápida para linting, formateo y organización de imports - reemplazando ESLint y Prettier.
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥
Tarjeta de referencia rápida - lista para copiar y pegar.
# Instala Biome
npm install --save-dev @biomejs/biome
# Inicializa la configuración
npx biome init
# Formatea archivos
npx biome format --write .
# Realiza lint en archivos
npx biome lint .
# Lint + formateo + organiza imports en un comando
npx biome check --write .Cuándo usarlo: Cuando quieres una única herramienta que sea significativamente más rápida que ESLint + Prettier combinados, con mínima configuración.
// biome.json
{
"$schema": "https://biomejs.dev/schemas/1.9.0/schema.json",
"organizeImports": {
"enabled": true
},
"formatter": {
"enabled": true,
"indentStyle": "space",
"indentWidth": 2,
"lineWidth": 80,
"lineEnding": "lf"
},
"javascript": {
"formatter": {
"semicolons": "always",
"quoteStyle": "double",
"trailingCommas": "all",
"arrowParentheses": "always"
}
},
"linter": {
"enabled": true,
"rules": {
"recommended": true,
"correctness": {
"useExhaustiveDependencies": "warn",
"noUnusedVariables": "error",
"noUnusedImports": "error"
},
"suspicious": {
"noExplicitAny": "warn"
},
"style": {
"useConst": "error",
"noNonNullAssertion": "warn"
},
"a11y": {
"useAltText": "error",
"useAnchorContent": "warn"
}
}
},
"files": {
"ignore": [
"node_modules/",
".next/",
"out/",
"coverage/",
"*.min.js"
]
}
}// package.json scripts
{
"scripts": {
"lint": "biome lint .",
"format": "biome format --write .",
"check": "biome check --write .",
"check:ci": "biome check ."
}
}Lo que esto demuestra:
biome.json reemplaza tanto .eslintrc como .prettierrcbiome check ejecuta lint + formateo + organización de imports en un solo pasocorrectness, suspicious, style, a11y, complexity, performance, securityrecommended habilita valores por defecto sensatos similares a eslint:recommended + react/recommendedMigrando desde ESLint + Prettier:
# Biome puede migrar tu configuración de ESLint
npx biome migrate eslint --write
# Migra la configuración de Prettier
npx biome migrate prettier --writeComparación de rendimiento:
| Tool | Tiempo (1000 archivos) | Notas |
|---|---|---|
| ESLint + Prettier | 5 a 15 segundos | Dos parses de AST separados |
| Biome | 100 a 500 milisegundos | Un único parse basado en Rust |
Integración con IDE:
// .vscode/settings.json
{
"editor.defaultFormatter": "biomejs.biome",
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"quickfix.biome": "explicit",
"source.organizeImports.biome": "explicit"
}
}// .vscode/extensions.json
{
"recommendations": ["biomejs.biome"]
}Sobrescrituras selectivas por directorio:
{
"overrides": [
{
"include": ["tests/**"],
"linter": {
"rules": {
"suspicious": {
"noExplicitAny": "off"
}
}
}
}
]
}// Biome entiende TypeScript de forma nativa - no necesita plugin de parser.
// Detecta:
// Imports no utilizados
import type { User } from "@/types"; // Eliminado si no se usa
// Variables no utilizadas
const unused = "hello"; // Error: noUnusedVariables
// Any explícito
const data: any = fetch("/api"); // Warn: noExplicitAny
// Aserciones non-null
const name = user!.name; // Warn: noNonNullAssertionCosas que pueden atraparte. Cada gotcha incluye qué sale mal, por qué sucede y la solución.
Sin ecosistema de plugins - Biome no soporta plugins de terceros. No hay equivalente de eslint-plugin-tailwindcss o eslint-plugin-testing-library. Solución: Si necesitas ordenar clases de Tailwind, usa prettier-plugin-tailwindcss junto a Biome (Biome para linting, Prettier solo para ordenar clases de Tailwind), o acepta la limitación.
Sin reglas específicas de Next.js - Biome no incluye reglas de eslint-plugin-next (no-img-element, no-head-element, etc.). Solución: Ejecuta next lint junto a Biome para verificaciones específicas de Next.js, o acepta la brecha.
Nombres de reglas diferentes - Los nombres de reglas difieren de ESLint (p. ej., noUnusedVariables vs no-unused-vars). Solución: Usa npx biome migrate eslint para convertir tu configuración automáticamente.
Diferencias de formateo respecto a Prettier - Biome busca ser compatible con Prettier pero no es 100% idéntico. Algunos casos extremos en formateo de JSX y TypeScript difieren. Solución: Ejecuta npx biome format en tu base de código una vez y revisa el diff. La mayoría de las diferencias son menores.
Otras formas de resolver el mismo problema - y cuándo cada una es la mejor opción.
| Alternativa | Usalo cuando | No lo uses cuando |
|---|---|---|
| ESLint + Prettier | Necesitas el ecosistema completo de plugins (Tailwind, testing, etc.) | El rendimiento es una preocupación principal |
oxlint + Prettier | Quieres linting rápido pero mantienes Prettier para formateo | Quieres una única herramienta unificada |
dprint + ESLint | Quieres un formateador rápido escrito en Rust con ESLint para linting | Quieres reducir la complejidad de las herramientas |
--write aplica todas las correcciones y cambios de formateo en su lugar.--write, solo reporta problemas (usa este modo en CI).npx biome migrate eslint --write
npx biome migrate prettier --writeEstos comandos convierten tus configuraciones existentes en equivalentes de biome.json.
eslint-plugin-tailwindcss o eslint-plugin-testing-library.prettier-plugin-tailwindcss junto a Biome para esa única tarea.eslint-plugin-next (no-img-element, no-head-element, etc.).next lint junto a Biome para verificaciones específicas de Next.js.noUnusedVariables en lugar de no-unused-vars.correctness, suspicious, style, a11y, complexity.npx biome migrate eslint para convertir nombres de reglas automáticamente.{
"editor.defaultFormatter": "biomejs.biome",
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"quickfix.biome": "explicit",
"source.organizeImports.biome": "explicit"
}
}any explícito y aserciones non-null.npx biome format en tu base de código y revisa el diff antes de hacer commit.{
"overrides": [
{
"include": ["tests/**"],
"linter": {
"rules": {
"suspicious": { "noExplicitAny": "off" }
}
}
}
]
}correctness -- bugs y errores de lógica (exhaustive deps, unused variables)suspicious -- código que probablemente está mal (explicit any, duplicate keys)style -- preferencias de estilo de código (const, naming)a11y -- verificaciones de accesibilidad (alt text, ARIA)complexity -- código demasiado complejoperformance -- anti-patrones de rendimientosecurity -- vulnerabilidades de seguridadRevisado por Chris St. John·Última actualización: 10 jul 2026
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥