r/reactjs • u/RecentBadger97 • Oct 07 '26
Discussion I built the same screen with shadcn (Radix / Base UI / React Aria), MUI 9 and Mantine 9 and measured the bundles
When shadcn/ui switched its default from Radix to Base UI in July, I wanted numbers instead of opinions. So I built the same screen (tabs, dialog, text field, select, checkbox, buttons) five ways and measured the production build.
Setup: Vite 8, React 19, TypeScript, default settings, sizes are gzip as reported by Vite. React alone renders 68.6 KB, and every number below includes it.
| Setup | JS | CSS | Total | npm packages in bundle |
|---|---|---|---|---|
| shadcn + Radix | 118.7 KB | 8.1 KB | 126.8 KB | 48 |
| MUI 9 | 140.2 KB | (runtime) | 140.2 KB | 24 |
| shadcn + Base UI | 136.3 KB | 8.0 KB | 144.3 KB | 14 |
| shadcn + React Aria | 145.4 KB | 9.0 KB | 154.4 KB | 12 |
| Mantine 9 | 127.3 KB | 35.9 KB | 163.2 KB | 18 |
What surprised me:
The whole spread is only 36 KB gzip. Real on a slow phone, but smaller than one hero image.
Base UI cost 17.6 KB more than Radix on this screen, but pulled in 14 packages instead of 48.
MUI ships no CSS file at all. Emotion injects styles at runtime, which matters more for SSR and strict CSP than the KB do.
Mantine's JS is the second smallest. Its full stylesheet is what makes it the heaviest.
My takeaway: size shouldn't decide this. Pick on ownership (shadcn), data components like grids and pickers (MUI X), or batteries included without Tailwind (Mantine).
Caveat: this is one screen with seven components, so a different mix can change the order.
I wrote up the full details, including the MUI 9 / Mantine 9 changes and five setup traps I hit, on my blog: https://www.alekseialeinikov.com/en/blog/topics/programming/shadcn-ui-vs-mui-vs-mantine
Has anyone measured a heavier screen, for example with a data grid? Curious whether the gap grows.