Jak (ne)zabít performance: 7 nejčastějších chyb v Tailwind + React + ShadcnUI
aneb proč rychlost aplikace není jen problém vývojářů, ale i tématu pro vedení firmy
Úvod: výkon jako tvrdá byznysová metrika
Každá stovka milisekund čekání zvyšuje pravděpodobnost, že zákazník odejde, a zároveň prodlužuje čas, který váš tým tráví laděním podpory. Frameworková trojice React + Tailwind + ShadcnUI dokáže zkrátit vývoj, ale při nepozornosti umí front‑end i back‑end výpočetně „přitopit“. Následujících sedm kapitol ukazuje nejběžnější přešlapy – od hromaděné nevyužité CSS až po nenápadné re‑rendery – a nabízí konkrétní způsoby, jak je na vlastním VPS uhlídat.
1 | Zapomenutý purge aneb megabajtová CSS v produkci
Tailwind generuje statickou sadu tříd; pokud mu v produkčním build procesu nedovolíte „vyhodit“ nevyužité styly, skončíte s CSS o řádu megabajtů Tailwind CSS.
Jak se bránit?
-
V
tailwind.config.jspečlivě zadefinujte polecontenttak, aby obsahovalo všechen relevantní zdrojový kód (JSX, TSX, MDX). -
Zapněte Just‑in‑Time (JIT) režim; kompilace generuje pouze skutečně použitou kombinaci tříd a i na velkých projektech se drží pod sekundou Tailwind CSS.
-
Pravidelně procházejte mapu zdrojů – špatně pojmenovaný soubor (např.
.jxsmísto.jsx) dokáže vyřadit celý modul z přehledu a CSS se nafukuje skrytě GitHub.
2 | Dynamický řetězec className zabíjí tree‑shaking
Příliš kreativní skládání tříd za běhu (const btn = "bg-" + color) působí neškodně, ale Terser ani Tailwind nedokážou takové výrazy staticky analyzovat. Výsledkem je, že bezpečnostně i výkonnostně nesete všechen CSS balast. Podobně React při každé změně vrací nový string → re‑render celého podstromu.
Lepší cesta
-
Používejte enumerované varianty (
${variant === 'primary' ? 'bg-blue-600' : 'bg-gray-200'}) nebo knihovnu clsx/twMerge, která ve stavební fázi zjednoduší řetězec. -
Kritické komponenty zabalte do
React.memo; drobná režie porovnání props je menší než neustálé znovuvytváření MediumStack Overflow.
3 | „Neviditelné“ re‑rendery skrz kontext a inline funkce
Každá anonymní funkce definovaná v JSX představuje novou referenci → React prop itself změněn → zbytečný render. Pokud komponenta navíc předává children s dalšími utility třídami, řetězí se i práce Tailwindu.
Praktické minimum
-
V‑důležitých kontejnerech deklarujte event handlery přes
useCallback. -
Složité datové struktury zavírat do
useMemo. -
Skutečný dopad odhalí React Profiler – nezřídka odhalí řádově stovky zbytečných renderů za minutu Reddit.
4 | Import celé ShadcnUI knihovny namísto code‑splittingu
ShadcnUI staví na Radix primitives. Pokud však prostě napíšete import * as Dialog from "@radix-ui/react-dialog", prohlížeč stáhne i moduly, které nepotřebujete. Typickou nástrahou jsou ikony (lucide‑react) – každá přidaná SVG může zvednout bundle o desítky kilobajtů.
Optimalizace
-
Lazy load komponenty, které se objevují až po interakci (modály, selecty) Stack OverflowStudyRaid.
-
Sledujte Bundlephobia; zjistíte, že některé Radix balíčky jsou sice jen pár kB, ale v součtu mohou tvořit nezanedbatelný chunk BundlephobiaBundlephobia.
-
Ikony načítejte jenom ty, které opravdu používáte – lucide podporuje tree‑shaking.
5 | Příliš dekorativní utility: stíny, filtry, animace
Tailwind dává k dispozici efekty jako shadow-2xl nebo backdrop-blur-lg; na slabších laptopech a mobilech se však mohou stát bottleneckem GPU. Test s kombinací čtyř komplexních animací ukázal 40 % zlepšení po jejich odlehčení Medium.
Co s tím?
-
Tam, kde stačí, volte ploché barvy a
shadow-sm. -
Přesuňte drahé animace do prefers-reduced-motion media query.
-
Na kritických stránkách aktivujte chromeových Lighthouse performance hints – rychle ukáže, které CSS vlastnosti způsobují layout‑thrashing.
6 | Nesledování růstu vektorového DOM a CSS map
Vývojář přidá dvě utility, copywriter další sekci a build pipeline náhle analyzuje několik tisíc tříd navíc. Pokud nehlídáte velikost mapy zdrojů a počet DOM node na stránku, snížíte LCP i poctivě odladěný CSS.
Management tip
-
Zavést do CI krok, který po
next buildloguje velikost CSS, JS a počet React node; změna > 10 % vyžaduje code‑review. -
Odsouhlaste si v týmu „stylovou směrnici“: komponenta nesmí mít víc než X utilit v kořenovém elementu – nad tento limit vzniká „semantické prázdno“ a kód se hůř udržuje DEV Community.
7 | Chybějící observabilita a zpětná vazba
Bez metrik nepoznáte, zda refaktor skutečně pomohl. Častá chyba je spoléhat se pouze na syntetické testy (Lighthouse) a ignorovat field data z reálných zařízení.
Zásady
-
Monitorujte Core Web Vitals (FID, LCP, CLS) přes open‑source knihovny ve front‑endu a posílejte je do grafového dashboardu.
-
V Reactu logujte Commit Phase Duration (schopnost komponenty dokončit render) – má jiné chování než samotné „paintování“.
-
Doplňte UX anketu; pokud uživatelé hlásí pomalost, čísla vypadala hezky jen v laboratoři MoldStud.
Závěr: malá pravidla, velký rozdíl
Kombinace Tailwind, Reactu a ShadcnUI je dnes synonymem pro rychlou tvorbu moderního front‑endu. Stejně rychle ale dokáže pohřbít UX i cloudový rozpočet, pokud se na ni nenahlíží holisticky – od build pipeline až po runtime chování.
-
Pro vedení firem: investice do výkonu není kosmetická úprava, ale způsob, jak nepřicházet o konverze a snižovat náklady na podporu.
-
Pro technické týmy: travte čas auditováním, ne hašením požárů. Malé změny (správný purge, lazy loading ikon) často přinesou víc než velké refaktory.
Klíčové sdělení: Výkon není jednorázový projekt, ale průběžná disciplína, jejíž ignorování vyjde vždy dráž než její průběžná kultivace.

