React 19 introduces a game-changing feature that transforms how we write React applications: the React Compiler. Combined with modern tools like Biome and Turbo, you can build faster, more efficient applications with less boilerplate code. Let's dive into what makes these tools essential for modern React development.
What is the React Compiler?
The React Compiler (formerly known as "React Forget") is an automatic optimization tool built directly into React 19. Think of it as a smart assistant that optimizes your code automatically, eliminating the need for manual performance optimizations.

The Problem It Solves
Before React 19, developers had to manually optimize components using hooks like useMemo, useCallback, and memo():
// ❌ Old way - Manual optimization required
function ProductList({ products, onSelect }) {
// Without useMemo, this filters on every render
const expensiveProducts = useMemo(() => {
return products.filter(p => p.price > 100);
}, [products]);
// Without useCallback, this creates a new function every render
const handleClick = useCallback((id) => {
onSelect(id);
}, [onSelect]);
return (
<div>
{expensiveProducts.map(product => (
<Product key={product.id} onClick={handleClick} />
))}
</div>
);
}With React 19's compiler, you can write cleaner code:
// ✅ New way - Compiler handles optimization automatically
function ProductList({ products, onSelect }) {
// No useMemo needed - compiler optimizes this automatically
const expensiveProducts = products.filter(p => p.price > 100);
// No useCallback needed - compiler memoizes this automatically
const handleClick = (id) => {
onSelect(id);
};
return (
<div>
{expensiveProducts.map(product => (
<Product key={product.id} onClick={handleClick} />
))}
</div>
);
}Setting Up React 19 Compiler
Step 1: Install React 19
First, upgrade to React 19:
npm install react@19 react-dom@19Step 2: Install the Compiler Plugin
Install the Babel plugin for the React Compiler:
npm install --save-dev babel-plugin-react-compilerStep 3: Configure Your Build Tool
For Vite (Recommended)
Install the Vite plugin:
npm install --save-dev vite-plugin-react-compilerUpdate your vite.config.js:
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import reactCompiler from 'vite-plugin-react-compiler';
export default defineConfig({
plugins: [
react(),
reactCompiler({
// Optional: Configure compiler options
sources: (filename) => {
// You can exclude specific files if needed
return !filename.includes('node_modules');
},
}),
],
});For Next.js
In next.config.js:
/** @type {import('next').NextConfig} */
const nextConfig = {
experimental: {
reactCompiler: true,
},
};
module.exports = nextConfig;For Webpack
Update your webpack.config.js:
module.exports = {
module: {
rules: [
{
test: /\.[jt]sx?$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
plugins: [
['babel-plugin-react-compiler', {
// Compiler options
}],
],
},
},
},
],
},
};Understanding Compiler Benefits
1. Automatic Memoization
The compiler automatically memoizes values and callbacks:
function ShoppingCart({ items }) {
// ✨ Automatically memoized
const total = items.reduce((sum, item) => sum + item.price, 0);
const tax = total * 0.08;
const finalPrice = total + tax;
return (
<div>
<p>Subtotal: ${total}</p>
<p>Tax: ${tax}</p>
<p>Total: ${finalPrice}</p>
</div>
);
}2. Smart Re-rendering
Components only re-render when necessary:
function UserProfile({ user }) {
// Only re-renders when user.name changes
const greeting = `Hello, ${user.name}!`;
// Only re-renders when user.posts changes
const postCount = user.posts.length;
return (
<div>
<h1>{greeting}</h1>
<p>You have {postCount} posts</p>
</div>
);
}3. Reduced Bundle Size
No need for manual memoization means less code:
// Before: ~30 lines with memoization
// After: ~15 lines - 50% reduction!Supercharging Development with Biome
Biome is a blazing-fast toolchain for web development that replaces ESLint and Prettier. It's written in Rust and offers incredible performance.
Installing Biome
npm install --save-dev @biomejs/biomeSetting Up Biome
Create biome.json in your project root:
{
"$schema": "https://biomejs.dev/schemas/1.5.0/schema.json",
"organizeImports": {
"enabled": true
},
"linter": {
"enabled": true,
"rules": {
"recommended": true,
"correctness": {
"useExhaustiveDependencies": "error"
},
"style": {
"noNonNullAssertion": "warn"
}
}
},
"formatter": {
"enabled": true,
"indentStyle": "space",
"indentWidth": 2,
"lineWidth": 80
},
"javascript": {
"formatter": {
"quoteStyle": "single",
"trailingComma": "es5"
}
}
}Using Biome in Your Workflow
Add scripts to package.json:
{
"scripts": {
"lint": "biome lint ./src",
"format": "biome format --write ./src",
"check": "biome check --apply ./src"
}
}Why Biome?
⚡ Lightning Fast: 25x faster than ESLint + Prettier
🔧 All-in-One: Linting + Formatting in one tool
🎯 Smart Defaults: Works great out of the box
📦 Zero Config: Minimal setup required
Example: Biome in Action
// Before formatting
function MyComponent({name,age}){
const greeting=`Hello ${name}`
return <div>{greeting}</div>
}
// After Biome format
function MyComponent({ name, age }) {
const greeting = `Hello ${name}`;
return <div>{greeting}</div>;
}Accelerating Builds with Turbo
Turbo (Turborepo) is a high-performance build system for JavaScript and TypeScript monorepos.
Installing Turbo
npm install turbo --save-devSetting Up Turbo
Create turbo.json:
{
"$schema": "https://turbo.build/schema.json",
"pipeline": {
"build": {
"dependsOn": ["^build"],
"outputs": ["dist/**", ".next/**"]
},
"lint": {
"dependsOn": ["^lint"]
},
"dev": {
"cache": false,
"persistent": true
},
"test": {
"dependsOn": ["^build"],
"outputs": ["coverage/**"]
}
}
}Update package.json
{
"scripts": {
"dev": "turbo run dev",
"build": "turbo run build",
"lint": "turbo run lint",
"test": "turbo run test"
}
}Key Turbo Features
1. Intelligent Caching
Turbo caches task outputs and never does the same work twice:
# First run: 45 seconds
npm run build
# Second run with no changes: 0.2 seconds (cached!)
npm run build2. Parallel Execution
Turbo runs tasks in parallel automatically:
# Runs lint, test, and build in parallel
turbo run lint test build3. Remote Caching
Share cache across your team:
# Enable remote caching
turbo login
turbo linkComplete Modern React Setup
Here's a complete example combining all these tools:
Project Structure
my-react-app/
├── src/
│ ├── components/
│ │ └── Counter.jsx
│ ├── App.jsx
│ └── main.jsx
├── biome.json
├── turbo.json
├── vite.config.js
├── package.json
└── README.md
Example Component
// src/components/Counter.jsx
import { useState } from 'react';
export function Counter({ initialValue = 0 }) {
const [count, setCount] = useState(initialValue);
// ✨ Compiler optimizes this automatically
const doubleCount = count * 2;
const isEven = count % 2 === 0;
// ✨ No useCallback needed
const increment = () => setCount(count + 1);
const decrement = () => setCount(count - 1);
const reset = () => setCount(initialValue);
return (
<div className="counter">
<h2>Count: {count}</h2>
<p>Double: {doubleCount}</p>
<p>Is Even: {isEven ? 'Yes' : 'No'}</p>
<div className="buttons">
<button onClick={decrement}>-</button>
<button onClick={reset}>Reset</button>
<button onClick={increment}>+</button>
</div>
</div>
);
}Complete package.json
{
"name": "modern-react-app",
"version": "1.0.0",
"type": "module",
"scripts": {
"dev": "turbo run dev",
"build": "turbo run build",
"lint": "biome lint ./src",
"format": "biome format --write ./src",
"check": "biome check --apply ./src",
"preview": "vite preview"
},
"dependencies": {
"react": "^19.0.0",
"react-dom": "^19.0.0"
},
"devDependencies": {
"@biomejs/biome": "^1.5.0",
"@vitejs/plugin-react": "^4.2.0",
"babel-plugin-react-compiler": "^19.0.0",
"turbo": "^1.11.0",
"vite": "^5.0.0",
"vite-plugin-react-compiler": "^1.0.0"
}
}Best Practices
1. Trust the Compiler
Don't add manual optimizations unless you have a specific performance issue:
// ❌ Don't do this anymore
const memoizedValue = useMemo(() => computeValue(a, b), [a, b]);
// ✅ Do this instead - let the compiler handle it
const value = computeValue(a, b);2. Write Clean Code
Focus on readability, let the compiler handle performance:
// ✅ Clean and readable
function ProductCard({ product }) {
const discountedPrice = product.price * (1 - product.discount);
const formattedPrice = `$${discountedPrice.toFixed(2)}`;
return (
<div>
<h3>{product.name}</h3>
<p>{formattedPrice}</p>
</div>
);
}3. Use Biome for Consistency
Run Biome before every commit:
npm run checkAdd a pre-commit hook:
{
"husky": {
"hooks": {
"pre-commit": "biome check --apply ./src"
}
}
}4. Leverage Turbo Caching
Structure your tasks to maximize cache hits:
{
"pipeline": {
"build": {
"dependsOn": ["^build"],
"outputs": ["dist/**"]
}
}
}Performance Comparison
Before React 19 Compiler
Manual memoization: ~30% of code
Bundle size: 150KB
Build time: 12s
Development overhead: High
After React 19 Compiler + Biome + Turbo
Manual memoization: ~0% (automated)
Bundle size: 120KB (20% reduction)
Build time: 3s (75% faster with Turbo cache)
Lint + Format: 0.5s (25x faster with Biome)
Development overhead: Low
Real-World Example: Todo App
import { useState } from 'react';
function TodoApp() {
const [todos, setTodos] = useState([]);
const [input, setInput] = useState('');
// ✨ All automatically optimized by the compiler
const activeTodos = todos.filter(todo => !todo.completed);
const completedTodos = todos.filter(todo => todo.completed);
const stats = {
total: todos.length,
active: activeTodos.length,
completed: completedTodos.length,
};
const addTodo = () => {
if (input.trim()) {
setTodos([...todos, { id: Date.now(), text: input, completed: false }]);
setInput('');
}
};
const toggleTodo = (id) => {
setTodos(todos.map(todo =>
todo.id === id ? { ...todo, completed: !todo.completed } : todo
));
};
const deleteTodo = (id) => {
setTodos(todos.filter(todo => todo.id !== id));
};
return (
<div className="todo-app">
<h1>My Todos</h1>
<div className="stats">
<span>Total: {stats.total}</span>
<span>Active: {stats.active}</span>
<span>Completed: {stats.completed}</span>
</div>
<div className="input-section">
<input
value={input}
onChange={(e) => setInput(e.target.value)}
onKeyPress={(e) => e.key === 'Enter' && addTodo()}
placeholder="What needs to be done?"
/>
<button onClick={addTodo}>Add</button>
</div>
<div className="todo-list">
<h2>Active</h2>
{activeTodos.map(todo => (
<TodoItem
key={todo.id}
todo={todo}
onToggle={toggleTodo}
onDelete={deleteTodo}
/>
))}
<h2>Completed</h2>
{completedTodos.map(todo => (
<TodoItem
key={todo.id}
todo={todo}
onToggle={toggleTodo}
onDelete={deleteTodo}
/>
))}
</div>
</div>
);
}
function TodoItem({ todo, onToggle, onDelete }) {
return (
<div className="todo-item">
<input
type="checkbox"
checked={todo.completed}
onChange={() => onToggle(todo.id)}
/>
<span style={{ textDecoration: todo.completed ? 'line-through' : 'none' }}>
{todo.text}
</span>
<button onClick={() => onDelete(todo.id)}>Delete</button>
</div>
);
}
export default TodoApp;Conclusion
React 19's compiler, combined with Biome and Turbo, represents a major leap forward in React development:
React Compiler: Write cleaner code, get automatic optimizations
Biome: Lightning-fast linting and formatting
Turbo: Intelligent caching and parallel execution
This modern stack allows you to:
📝 Write simpler, more readable code
⚡ Build and deploy faster
🎯 Focus on features, not optimization
🔧 Maintain consistency across your team
📦 Reduce bundle sizes automatically
Start your journey with these tools today, and experience the future of React development!
Resources
🚀 Join the Developer Universe
Ready to level up your React game? Connect with me across the digital cosmos where I share cutting-edge insights, exclusive tutorials, and behind-the-scenes development magic:
🎥 YouTube (English) → Subscribe for next-gen tutorials
Deep-dive video content, live coding sessions, and framework comparisons in english language
🎥 YouTube (Bangla) → Subscribe for next-gen tutorials
Deep-dive video content, live coding sessions, and framework comparisons
⚡ GitHub → Explore the code universe
Open-source projects, starter templates, and collaborative experiments
💼 LinkedIn → Network in the professional sphere
Career insights, industry trends, and professional development
🌐 X (Twitter) → Real-time dev insights
Quick tips, hot takes, and lightning-fast industry updates
📱 Facebook → Community central hub
Extended discussions, community polls, and collaborative learning
☕ Buy Me a Coffee → Fuel the code machine
Support exclusive content creation and unlock premium resources
💫 What You'll Get
⚡ Early access to new tutorials and frameworks
🔥 Exclusive code snippets and project templates
🎯 Direct Q&A on complex development challenges
🚀 Beta previews of upcoming content and projects
Spotted a bug in the matrix or have innovative ideas? Ping me on any channel above - the future of web development is collaborative!
Happy coding! 🚀
