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.
Recipe
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.
Working Example
// 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:
- Un único
biome.jsonreemplaza tanto.eslintrccomo.prettierrc - Las opciones del formateador reflejan la configuración familiar de Prettier
- Las reglas del linter cubren React hooks, variables no utilizadas, accesibilidad y patrones de TypeScript
biome checkejecuta lint + formateo + organización de imports en un solo paso
Deep Dive
Cómo funciona
- Biome está escrito en Rust, lo que lo hace de 10 a 100 veces más rápido que ESLint + Prettier
- Usa un único parse de AST para linting, formateo y organización de imports (sin herramientas separadas)
- Las reglas se agrupan por categoría:
correctness,suspicious,style,a11y,complexity,performance,security - El preset
recommendedhabilita valores por defecto sensatos similares aeslint:recommended+react/recommended - Sin sistema de plugins — todas las reglas están integradas
Variations
Migrando 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"
}
}
}
}
]
}TypeScript Notes
// 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: noNonNullAssertionGotchas
Cosas 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-tailwindcssoeslint-plugin-testing-library. Solución: Si necesitas ordenar clases de Tailwind, usaprettier-plugin-tailwindcssjunto 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: Ejecutanext lintjunto 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.,
noUnusedVariablesvsno-unused-vars). Solución: Usanpx biome migrate eslintpara 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 formaten tu base de código una vez y revisa el diff. La mayoría de las diferencias son menores.
Alternatives
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 |
FAQs
¿Cuánto más rápido es Biome que ESLint + Prettier?
- Biome es típicamente de 10 a 100 veces más rápido.
- Parse el AST una sola vez para linting, formateo y organización de imports.
- En 1000 archivos, Biome tarda 100-500ms versus 5-15 segundos para ESLint + Prettier.
¿Qué hace biome check --write?
- Ejecuta linting, formateo y organización de imports en un solo paso.
--writeaplica todas las correcciones y cambios de formateo en su lugar.- Sin
--write, solo reporta problemas (usa este modo en CI).
¿Puedo migrar mis configuraciones existentes de ESLint y Prettier a Biome?
npx biome migrate eslint --write
npx biome migrate prettier --writeEstos comandos convierten tus configuraciones existentes en equivalentes de biome.json.
Gotcha: ¿Biome soporta plugins de terceros?
- No. Biome no tiene sistema de plugins.
- No hay equivalente de
eslint-plugin-tailwindcssoeslint-plugin-testing-library. - Si necesitas ordenar clases de Tailwind, usa
prettier-plugin-tailwindcssjunto a Biome para esa única tarea.
¿Biome incluye reglas específicas de Next.js?
- No. Biome no distribuye equivalentes de
eslint-plugin-next(no-img-element, no-head-element, etc.). - Ejecuta
next lintjunto a Biome para verificaciones específicas de Next.js. - La mayoría de reglas genéricas de React y accesibilidad están cubiertas.
¿Cómo difieren los nombres de reglas de Biome respecto a ESLint?
- Biome usa camelCase:
noUnusedVariablesen lugar deno-unused-vars. - Las reglas se agrupan por categoría:
correctness,suspicious,style,a11y,complexity. - Usa
npx biome migrate eslintpara convertir nombres de reglas automáticamente.
¿Cómo configuro Biome en VS Code?
{
"editor.defaultFormatter": "biomejs.biome",
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"quickfix.biome": "explicit",
"source.organizeImports.biome": "explicit"
}
}¿Biome maneja TypeScript sin configuración adicional?
- Sí. Biome entiende TypeScript de forma nativa sin necesidad de plugin de parser.
- Detecta imports no utilizados, variables no utilizadas,
anyexplícito y aserciones non-null. - Los imports de solo tipo se manejan a través de su característica de organización de imports.
Gotcha: ¿Es el formateo de Biome 100% compatible con Prettier?
- No exactamente. Biome busca ser compatible con Prettier pero tiene diferencias menores en casos extremos.
- Ejecuta
npx biome formaten tu base de código y revisa el diff antes de hacer commit. - La mayoría de diferencias están en formateo de JSX y TypeScript y son cosméticas.
¿Cómo aplico reglas diferentes para archivos de pruebas?
{
"overrides": [
{
"include": ["tests/**"],
"linter": {
"rules": {
"suspicious": { "noExplicitAny": "off" }
}
}
}
]
}¿En qué categorías se organizan las reglas de Biome?
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 seguridad
¿Puedo usar Biome para linting y Prettier para formateo?
- Sí, pero eso derrota el propósito del enfoque unificado de Biome.
- Si solo necesitas Prettier para ordenar clases de Tailwind, deshabilita el formateador de Biome y usa Prettier solo para formateo.
Related
- ESLint Setup for Next.js — traditional ESLint setup
- Prettier Setup — traditional formatting setup
- ESLint + Prettier Integration — making the traditional tools coexist
- Linting in CI/CD — running Biome in CI