The Evolution of JavaScript Tooling
From Separate Tools to Unified Toolchains
For years, the standard JavaScript development workflow involved ESLint for catching code quality issues and Prettier for enforcing consistent formatting. While effective, this approach had significant drawbacks:
- Managing two separate configuration files
- Potential conflicts between ESLint's stylistic rules and Prettier's formatting
- Separate plugin ecosystems requiring careful coordination
- Slower execution times due to Node.js runtime overhead
ESLint, released in 2013, became the standard for JavaScript linting, while Prettier arrived in 2017 to solve formatting inconsistencies. Together they formed a powerful combination, but the overhead of maintaining two tools with overlapping concerns led developers to seek simpler solutions.
If you're still evaluating your linting options, our guide on modern ESLint alternatives provides a comprehensive comparison of available tools.
What Is Rome/Biome?
Rome Tools was an ambitious project created by Facebook in 2020 with the goal of building a unified toolchain for JavaScript development. It was designed from scratch to replace ESLint, Prettier, and other individual tools with a single, cohesive solution. The project gained significant attention in the developer community for its bold vision, as described by LogRocket's coverage of the Rome project.
In 2022, the Rome team announced they would no longer maintain the original Rome project. However, the community response was positive--developers recognized the value of the unified toolchain approach. This led to the creation of Biome, a fork of Rome that continues development with an active community and regular releases.
Biome maintains the core vision of Rome while advancing the project with new features, bug fixes, and improved performance. The tooling is written in Rust, providing significantly faster execution times compared to Node.js-based alternatives.
Why Migrate: The Case for Biome
Why leading development teams are making the switch
Performance Benchmarks
One of the most compelling reasons to migrate to Biome is performance. Written in Rust and compiled to native binaries, Biome delivers dramatic speed improvements over the ESLint + Prettier combination.
Simplified Toolchain
Beyond performance, Biome offers a simplified development experience with a single configuration file and unified toolchain.
Better Error Messages
Biome provides more descriptive error messages compared to ESLint, helping developers understand not just what to fix, but why.
Smaller Dependency Footprint
Reduce npm packages from 100+ to just one, improving security and reducing install times.
Migration Process: Step by Step
Prerequisites and Preparation
Before beginning your migration, assess your current setup:
- Audit your ESLint configuration: Note which rules you use, especially any custom or plugin-based rules
- Review your Prettier settings: Identify your formatting preferences (quotes, semicolons, trailing commas, etc.)
- Check for plugin dependencies: Some ESLint plugins may not have Biome equivalents
As outlined in A Million Monkeys' migration guide, this preparation phase is critical for a smooth transition.
Understanding your current linting setup is essential. Our guide on JavaScript linting options can help you evaluate where Biome fits into your workflow.
Step 1: Install Biome
Install Biome as a development dependency:
npm install --save-dev --save-exact @biomejs/biome
Using --save-exact ensures consistent versions across environments, which is essential for tooling consistency in team environments.
Configuration Deep Dive
1{2 "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",3 "formatter": {4 "enabled": true,5 "indentStyle": "space",6 "indentWidth": 2,7 "lineWidth": 1008 },9 "linter": {10 "enabled": true,11 "rules": {12 "recommended": true13 }14 },15 "javascript": {16 "formatter": {17 "quoteStyle": "single",18 "trailingCommas": "es5"19 }20 }21}Formatter Settings
Biome's formatter settings control indentation, line width, and overall code appearance:
"formatter": {
"enabled": true,
"indentStyle": "space", // or "tab"
"indentWidth": 2,
"lineWidth": 100,
"ignore": []
}
The formatter applies to all supported file types and integrates seamlessly with the linter for consistent code quality.
Linter Rules
Rules can be set to "error" or "warn" to enable, "off" to disable, or "info" for informational messages:
"linter": {
"enabled": true,
"rules": {
"recommended": true,
"suspicious": {
"noExplicitAny": "warn",
"noArrayIndexKey": "warn"
},
"style": {
"noNonNullAssertion": "off"
},
"complexity": {
"noForEach": "off"
}
}
}
This configuration enables Biome's recommended rules while allowing teams to customize specific rules based on their preferences.
What You Gain and What You Lose
When to Migrate
Ideal Candidates for Migration
Migrating to Biome makes sense when:
- Starting new projects: No existing configuration to maintain
- Using primarily standard rules: Your ESLint config isn't heavily customized
- Performance matters: Large codebases or CI pipelines where speed matters
- Simplicity is valued: Willing to accept fewer rules for simpler tooling
- React without heavy plugins: Not relying on jsx-a11y or other plugin-specific rules
When to Stay with ESLint + Prettier
Keep your current setup if:
- You need comprehensive accessibility linting: Relying on
eslint-plugin-jsx-a11y - Extensive custom rules: Have invested in custom ESLint rules
- Framework-specific tooling: Your project depends on specialized plugins
- Maximum compatibility needed: Working with diverse codebases and teams
For TypeScript-first development teams prioritizing performance and simplicity, Biome represents an excellent choice. Teams with complex linting requirements may benefit from a phased approach--adopting Biome for new code while maintaining ESLint for existing codebases.
Best Practices
Incremental Migration
For existing projects, consider an incremental approach:
- Add Biome alongside ESLint + Prettier
- Run Biome on new code first
- Gradually apply Biome to modified files
- Full migration when comfortable
Editor Setup
Configure your VS Code for Biome:
{
"editor.formatOnSave": true,
"editor.defaultFormatter": "biomejs.biome",
"[javascript]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[typescript]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[typescriptreact]": {
"editor.defaultFormatter": "biomejs.biome"
}
}
Install the Biome VS Code extension from the marketplace for the best experience.
1# GitHub Actions example2- name: Run Biome3 run: npx @biomejs/biome check --ci .Git Hooks
With Husky, add to your pre-commit hook:
#!/bin/sh
npx @biomejs/biome check --write --changed .
The --changed flag ensures Biome only checks files that have been modified, making pre-commit checks lightning-fast even in large codebases.
Conclusion
Migrating from ESLint + Prettier to Biome represents a shift toward simpler, faster JavaScript tooling. The performance gains are significant--often 10x faster execution--while the unified toolchain reduces configuration complexity and dependency overhead.
However, the migration isn't without trade-offs. Biome's smaller rule set means some ESLint plugins won't have equivalents, and the younger ecosystem means less community knowledge to draw upon. For teams prioritizing TypeScript development with standard linting needs, Biome offers an excellent balance of performance and simplicity.
For new projects, Biome is an excellent default choice. For existing projects, evaluate whether Biome's rule coverage meets your needs. Many teams find the performance benefits and simplicity worth accepting some rule gaps. The JavaScript tooling landscape continues to evolve, and Biome represents a promising direction toward unified, high-performance development tools.
Combined with optimized bundle sizes and modern tooling approaches, Biome helps create a streamlined development workflow that prioritizes developer productivity.
Sources
- A Million Monkeys: Replacing ESLint and Prettier for Biome - Comprehensive migration guide with benchmarks
- AppSignal: Migrating A JavaScript Project from Prettier and ESLint to BiomeJS - Practical setup and configuration details
- LogRocket: Migrating from Prettier to Rome - Historical context on Rome's development