Zpět na články

🧩 Opinionated přístup ke strukturování komponent

jakub-jetleb-hs
Jakub Jetleb
14.10.2025
# Frontend
glen-carrie-HpMihL323k0-unsplash (1)

Každý projekt začíná nevinně — složka components/, pár základních souborů jako Button.jsx, Header.jsx, Card.jsx… a všechno vypadá přehledně. Jenže po pár měsících (nebo letech) se z té složky stane černá díra. Komponenty mají podobné názvy, někdy dělají skoro totéž, ale přesto jsou jiné. A onboardovat nového vývojáře do takového projektu? Peklo.

Postupem času jsem si začal víc všímat, že struktura komponent není jen otázka estetiky nebo osobní preference. Je to architektonické rozhodnutí, které ovlivňuje škálovatelnost projektu, konzistenci, ale i mentální pohodu celého týmu. Proto jsem si vytvořil svůj vlastní, „opinionated“ systém, který mi už roky pomáhá držet pořádek v projektech, kde komponenty rostou geometrickou řadou.

Proč vůbec řešit strukturu komponent?

Většina článků o architektuře frontend projektů se soustředí na technologie, knihovny, performance nebo build procesy. Ale málokdo řeší, jak vůbec komponenty kategorizovat. A přitom právě tohle rozhoduje o tom, jestli se v projektu dokážeš zorientovat za minutu — nebo za půl dne.

Potřeboval jsem systém, který:

  • se dá škálovat – zvládne stovky komponent bez chaosu,
  • je čitelný a konzistentní,
  • umožňuje rychlý onboarding nových lidí,
  • a má jasně definované úrovně zodpovědnosti – co má komponenta dělat a co už ne.

Po několika iteracích jsem si vytvořil přístup, který se mi dlouhodobě osvědčil. Zjednodušeně řečeno – komponenty rozděluju podle úrovně jejich abstrakce a zodpovědnosti.

Můj systém vrstev

Každá komponenta má své místo a jasný účel. Díky tomu se v projektu dá rychle zorientovat, i když ho otevřu po půl roce.

Core – základní stavební kameny

Komponenty, které tvoří úplný základ UI. Mají jasnou funkci, nejsou závislé na žádné konkrétní části projektu a používají se napříč celým kódem.

Button, Link, Img, Modal, Pagination

Můžu je chápat jako čisté, nízkoúrovňové komponenty, které řeší jen svůj vizuál nebo chování, ale nic „nad nimi“. Button neřeší, kde se používá ani jaký má význam v kontextu stránky — prostě jen vykresluje tlačítko.

Bases – základní stavební bloky

Komponenty, které definují určité rozložení nebo standardizovaný vzhled. Něco jako „wrappery“, které drží jednotný styl a chování.

BaseSection, BaseHeader, BaseForm

Jsou to stavební bloky, které drží projekt pohromadě vizuálně i logicky. Všude se chovají stejně, a tím vzniká konzistence napříč webem.

Items – jednotlivé obsahové položky

Item je komponenta, která reprezentuje jednu obsahovou jednotku – například produkt, článek, událost, recenzi, cokoliv.

Item neřeší layout – tedy kolik jich je v řádku, jestli jsou ve slideru nebo v gridu. Jeho jediná zodpovědnost je zobrazit daný obsah správně a samostatně.

Groups – seskupení itemů

Group komponenta je nadřazená – stará se o to, jak se itemy vykreslí. Může řešit grid, slider, karusel, layout…

ProductsGroup, ArticlesGroup, EventsGroup

Zodpovědnost je jednoduchá: iterovat itemy a správně je rozmístit. Group ví, kolik jich má zobrazit, jak se má chovat na mobilech, může řešit lazy loading nebo pagination. Item tohle vůbec neřeší – a to je přesně ta čistota, kterou chci.

Sections – celé stavební bloky stránky

Section už představuje konkrétní, vizuálně i obsahově kompletní část webu. Typicky kombinuje několik předchozích vrstev – například BaseHeader, ProductsGroup, ButtonGroup atd.

HeroSection, ArticlesSection, ProductsSection

Sectiony mají jasně danou odpovědnost – vykreslit konkrétní sekci stránky. Díky tomu se dají snadno přeskupovat, znovu použít, nebo i konfigurovat přes CMS.

Fields – atomické formulářové prvky

Pole (Field) je nejmenší, opakovaně použitelná jednotka formuláře. Jeho odpovědnost je čistě zobrazit vstupní prvek, řešit label, chybu, placeholder, případně vnitřní logiku. Nic víc.

TextField, EmailField, SelectField, CheckboxField, SwitchField, FileField, SearchSelectField

Když máš dobře definované Fieldy, celý formulář se skládá velmi rychle a konzistentně. Navíc to usnadňuje jejich testování a údržbu.

Forms – konkrétní sestavy Fieldů

Form už je konkrétní implementace určitého účelu – například kontakt, přihlášení nebo objednávka. Form tedy kombinuje různé Fieldy, ale neměl by obsahovat layout nebo prvky, které se netýkají samotného formuláře. Díky tomu lze Form použít třeba jak na stránce, tak v modalu.

ContactForm, LoginForm, NewsletterForm

Tento přístup dělá formuláře znovupoužitelné a přenositelnější – nemusíš mít pro každé umístění jeho vlastní variantu.

 

Technologie? Nepodstatné

Celý tento systém není vázaný na konkrétní framework. Používám ho v Twigu, ale stejně dobře by fungoval i v Reactu, Vue, Astru nebo prakticky jakémkoliv templating systému.

Jde o způsob uvažování – o to, jak rozdělit komponenty podle jejich významu a odpovědnosti, ne o syntaxi. Když máš jasnou strukturu, framework se stává jen implementačním detailem.

Pojmenování pak plyne přirozeně:

ProductItem, ProductsGroup, TextField, ContactForm, LoginModal

Každé jméno jasně říká, kam komponenta patří a co má na starosti.

Proč to celé funguje

Od chvíle, kdy jsem si tento systém zavedl, se mi:

  • zrychlil onboarding nových lidí — složky a názvy samy napoví, co kam patří,
  • zlepšila konzistence — žádné nahodilé komponenty typu NewSection2.jsx,
  • zjednodušila údržba — změna layoutu nebo přejmenování se dělá v jedné vrstvě,
  • a hlavně: i po roce se do projektu vrátím a okamžitě vím, kde co je.

Tohle všechno zní banálně, dokud člověk nezažije projekt s 200+ komponentami, z nichž polovina dělá totéž jen jinak.

Není to dogma

Tenhle systém není univerzální pravda. Je to framework pro přemýšlení o komponentách. Umožňuje rozdělit odpovědnosti, držet konzistenci a vyhnout se chaosu. A přitom zůstává flexibilní – můžeš ho zjednodušit, rozšířit nebo přizpůsobit podle typu projektu.

Nejde o to mít složku pojmenovanou přesně stejně, ale o to, aby každá komponenta měla jasnou roli a místo.

Závěrem

Když máš systém, projekt roste klidněji. Komponenty přibývají, ale chaos ne. A i když to zní jako detail, právě tahle „neviditelná struktura“ často rozhoduje o tom, jestli se z projektu po roce nezblázníš.

Sdílejte článek na:

Další z kategorie

Mám zájem o...