Optimizing React Performance: From 3s to 300ms
Real performance wins from a production React app — covering code splitting, memo strategies, virtualization, and the new React compiler.
The Problem
Our dashboard was taking 3 seconds to become interactive. Users were bouncing. We needed to fix it fast.
Here's the systematic approach we took to cut load time by 90%.
Step 1: Measure First
Before optimizing anything, we profiled with React DevTools and Lighthouse. The results showed three main bottlenecks: a 2MB JavaScript bundle, 500+ component re-renders on initial load, and a 200-row table rendering all rows at once.
Step 2: Code Splitting
We lazy-loaded every route and heavy component.
Tip
Don't just code-split routes — split heavy components within routes too.
Step 3: Virtualization
For our 200-row table, we switched to virtual rendering with @tanstack/react-virtual.
Step 4: Strategic Memoization
Not everything should be memoized. We focused on components that receive object/array props, components in frequently-updating contexts, and expensive computed values.
Results
TTI went from 3.2s to 0.3s, bundle size from 2.1MB to 420KB, re-renders from 500+ to 45, Lighthouse from 34 to 96.
Written by
Sarah Chenadmin
Senior frontend engineer and tech writer. Passionate about React, TypeScript, and building great developer experiences. Previously at Vercel and Stripe.
Comments (1)
Those before/after metrics are impressive! Did you also try React Server Components for the initial load optimization?
Keep reading
engineering
Mastering TypeScript Generics: Real-World Patterns
Move beyond basic generics with practical patterns for type-safe APIs, component props, and utility types that you'll use every day.
engineering
Advanced Git Workflows for Team Collaboration
Master trunk-based development, conventional commits, and automated releases. Plus: the rebase vs merge debate, settled once and for all.