- 1. Anatómia INP: Čo presne meria a prečo nahradilo FID
- ↳ Rozdiel medzi FID a INP
- ↳ Klasifikácia hodnôt INP
- 2. Hlavné príčiny vysokého INP vo WordPress a WooCommerce
- Ťažký JavaScript a blokovanie hlavného vlákna (Main Thread Blocking)
- ↳ Blokujúci AJAX vo WooCommerce
- ↳ Nadmerná veľkosť DOM (DOM Size) a zložitosť CSS
- 3. Ako odhaliť problematické interakcie a skripty
- ↳ Nástroje na zber reálnych dát (Field Data)
- ↳ Práca s Chrome DevTools (Performance panel)
- ↳ Analýza nahrávky výkonu
- 4. Praktické techniky optimalizácie JavaScriptu vo WordPresse
- ↳ Správne používanie defer a async vo WordPresse
- ↳ Optimalizácia obsluhy udalostí (Debouncing a Throttling)
- 5. Optimalizácia WooCommerce špecifických procesov
- ↳ Eliminácia zdržania pri "Pridať do košíka" (Add-to-Cart)
- ↳ Riešenie 1: Optimistické aktualizácie používateľského rozhrania (Optimistic UI Update)
- ↳ Riešenie 2: Využitie WooCommerce Cart fragmentov s rozumom
- ↳ Zrýchlenie reakcie filtrov produktov (Faceted Search)
- ↳ Prepínanie variácií produktov (Variable Products)
- 6. CSS a DOM optimalizácie na zníženie Presentation Delay
- ↳ Využitie vlastnosti content-visibility
- ↳ Prevencia "Layout Thrashing" (Vynútený synchrónny reflow)
- 7. Prípadová štúdia: Optimalizácia WooCommerce archívu produktov
- ↳ Pôvodný stav a diagnostika cez Performance Panel
- ↳ Implementované kroky a kódové zmeny
- ↳ Výsledky optimalizácie
- 8. Záver a kontrolný zoznam (Checklist) pre vývojárov
- ↳ Odkazy na odborné zdroje:
Cieľom tohto článku je poskytnúť technicky hlboký a praktický návod pre WordPress a WooCommerce vývojárov, ako diagnostikovať, analyzovať a systematicky odstraňovať úzke hrdlá spôsobujúce vysoké INP, s dôrazom na prácu s Chrome DevTools, optimalizáciu JavaScriptu a architektúru databázových dopytov na pozadí interakcií.
Pre platformy ako WordPress a najmä WooCommerce je zavedenie INP obrovskou výzvou. E-shopy sú zo svojej podstaty vysoko interaktívne aplikácie. Používatelia neustále klikajú na tlačidlá „Pridať do košíka“, otvárajú filtrovanie produktov, prepínajú variácie, rozbaľujú harmoniky (accordions) s informáciami, píšu do vyhľadávacích polí alebo prechádzajú procesom pokladne (checkoutu). Akákoľvek latencia pri týchto úkonoch priamo poškodzuje používateľskú skúsenosť (UX) a znižuje konverzný pomer.
Táto zmena predstavuje zásadný posun v paradigme hodnotenia webovej rýchlosti. Zatiaľ čo FID meralo iba prvé oneskorenie vstupu (reakciu na úplne prvú interakciu používateľa po načítaní) a ignorovalo čas potrebný na spracovanie a vykreslenie spätnej väzby, INP sleduje latenciu všetkých interakcií počas celej návštevy používateľa na stránke a zaznamenáva tú najhoršiu (resp. jej reprezentatívnu hodnotu pri vysokom počte interakcií).
1. Anatómia INP: Čo presne meria a prečo nahradilo FID
Aby sme dokázali INP efektívne optimalizovať, musíme presne pochopiť, z akých fáz sa táto metrika skladá a v čom spočíva jej rozdiel oproti predchádzajúcej metrike FID.
Rozdiel medzi FID a INP
FID meralo iba čas od chvíle, keď používateľ prvýkrát interagoval so stránkou (napr. klikol na odkaz), do chvíle, kedy prehliadač skutočne dokázal začať spracovávať túto interakciu (handling). Nemeralo čas samotného behu JavaScriptu, ani čas, kým prehliadač prekreslil pixel na obrazovke. Ak mal web zablokované hlavné vlákno počas načítania, ale po kliknutí rýchlo zareagoval, FID bolo v poriadku, hoci používateľ mohol na vizuálnu zmenu čakať ďalšie tri sekundy.
INP meria celkový čas od momentu, kedy používateľ iniciuje interakciu, až do chvíle, kedy prehliadač vykreslí nasledujúci rámec (Next Paint), ktorý používateľovi poskytne vizuálnu spätnú väzbu o tom, že sa niečo stalo. Podľa oficiálnej dokumentácie Google Web Vitals sa INP delí na tri presne definované sub-fázy:
- Oneskorenie vstupu (Input Delay / Input Queueing Delay): Čas, ktorý uplynie od fyzického kliknutia alebo stlačenia klávesu po moment, kedy prehliadač začne spúšťať priradený JavaScript event handler. Toto oneskorenie je najčastejšie spôsobené tým, že hlavné vlákno (Main Thread) prehliadača je vyťažené inou prácou (napríklad kompiláciou a spúšťaním iných JS skriptov).
- Čas spracovania (Processing Time / Execution Time): Celkový čas, ktorý prehliadač strávi vykonávaním všetkých pridružených event handlerov (napríklad click, mousedown, pointerup udalostí). Ak je váš kód neefektívny, vykonáva zložité výpočty alebo synchrónne manipuluje s DOM, táto fáza sa výrazne predĺži.
- Oneskorenie prezentácie (Presentation Delay): Čas potrebný na to, aby prehliadač prepočítal štýly (recalculate styles), preusporiadal prvky na stránke (layout / reflow), vykreslil ich (paint) a zobrazil výsledný rámec na obrazovke. K predĺženiu dochádza vtedy, ak je DOM príliš veľký, alebo ak JavaScript vynúti synchrónny reflow (tzv. layout thrashing).
Klasifikácia hodnôt INP
Podľa metodiky Google sú stanovené nasledujúce prahové hodnoty pre INP:
- Dobrá (Good): menej alebo rovné 200 ms. Stránka reaguje svižne a používateľ nevníma žiadne oneskorenie.
- Vyžaduje zlepšenie (Needs Improvement): medzi 200 ms a 500 ms.
- Slabá (Poor): viac ako 500 ms. Používateľ jasne vníma „zmrznutie“ webu, čo vedie k frustrácii.
Ak sa chcete dozvedieť viac o metodológii merania, oficiálny sprievodca na web.dev/inp podrobne popisuje matematický model výpočtu INP pri dlhých reláciách.
2. Hlavné príčiny vysokého INP vo WordPress a WooCommerce
Ekosystém WordPressu je známy svojou modulárnosťou. Táto flexibilita (možnosť kombinovať témy, page buildery a desiatky pluginov) je však zároveň najväčším nepriateľom nízkeho INP. Každý pridaný plugin môže do stránky injektovať vlastný JavaScript, ktorý blokuje hlavné vlákno.
Ťažký JavaScript a blokovanie hlavného vlákna (Main Thread Blocking)
Prehliadače spracovávajú vizuálne zmeny a JavaScript v jednom spoločnom vlákne (tzv. Main Thread). Ak toto vlákno vykonáva takzvanú dlhú úlohu (Long Task) — čo je akákoľvek úloha, ktorej spracovanie trvá dlhšie ako 50 ms (podľa štandardov W3C) — nemôže v tom istom čase reagovať na interakcie používateľa. Kliknutia sa zaradia do fronty (queue) a čakajú na dokončenie dlhej úlohy, čo priamo nafukuje Input Delay.
Vo WordPresse sú týmito blokujúcimi faktormi najčastejšie:
- Komplexné page buildery (Elementor, Divi, WP Bakery): Tieto nástroje často načítavajú masívne knižnice JavaScriptu na obsluhu sliderov, vyskakovacích okien, animácií či paralaxných efektov, ktoré sa inicializujú okamžite po načítaní stránky.
- Sledovacie a analytické skripty (Google Tag Manager, Hotjar, Facebook Pixel): Tretie strany často vykonávajú intenzívnu analytickú prácu na pozadí, zaznamenávajú pohyby myšou alebo analyzujú DOM, čo vedie k neustálemu vyťažovaniu procesora.
Blokujúci AJAX vo WooCommerce
WooCommerce historicky spolieha na admin-ajax.php alebo vlastný endpoint ?wc-ajax=… na asynchrónne aktualizácie košíka, pokladne a filtrov.
Keď zákazník klikne na „Pridať do košíka“, WooCommerce inicializuje AJAX dopyt. Hoci samotný sieťový prenos prebieha na pozadí, proces spracovania tejto udalosti v JavaScripte (príprava dát, odoslanie a najmä spracovanie JSON odpovede a následná masívna aktualizácia DOM košíka) blokuje hlavné vlákno.
Ak serveru trvá odpoveď na AJAX dopyt 1.5 sekundy a JavaScript počas tejto doby neposkytne žiadny vizuálny stav (napr. loader), používateľ kliká opakovane, čo INP drasticky zhoršuje.
Nadmerná veľkosť DOM (DOM Size) a zložitosť CSS
WooCommerce e-shopy s tisíckami produktov a komplexnými filtrami majú často extrémne veľký dokumentový objektový model (DOM) — nezriedka presahujúci 3 000 až 5 000 elementov.
Keď JavaScript vykoná aj drobnú zmenu (napríklad pridanie jednej CSS triedy .active po kliknutí na filter), prehliadač musí prepočítať štýly pre obrovské množstvo elementov. Tento proces prepočtu štýlov a následného prekreslenia (Presentation Delay) rastie exponenciálne s veľkosťou a hĺbkou DOM stromu.
3. Ako odhaliť problematické interakcie a skripty
Predtým, než začnete písať kód alebo inštalovať optimalizačné pluginy, musíte presne vedieť, ktorá interakcia zlyháva a ktorý skript ju blokuje. Diagnostika sa delí na analýzu reálnych dát (Field Data) a laboratórne testovanie (Lab Data).
Nástroje na zber reálnych dát (Field Data)
Reálne dáta od skutočných používateľov sú najdôležitejšie, pretože INP priamo závisí od zariadení, ktoré vaši zákazníci používajú (mobilné telefóny strednej a nižšej triedy majú oveľa pomalší procesor ako vývojársky MacBook).
- Chrome User Experience Report (CrUX): Poskytuje agregované dáta za posledných 28 dní pre domény s dostatočnou návštevnosťou. Tieto dáta vidíte v Google Search Console v sekcii „Core Web Vitals“.
- Knižnica web-vitals.js: Môžete ju implementovať priamo do vášho WordPress webu na logovanie zlých interakcií do Google Analytics 4 (GA4). Tento skript zachytí presnú interakciu (napr. target element priradený k ID tlačidla), veľkosť latencie a fázu, v ktorej k zdržaniu došlo.
Práca s Chrome DevTools (Performance panel)
Na lokálne replikovanie a odstránenie vysokého INP je najlepším nástrojom panel Performance (Výkon) v Chrome DevTools. Postupujte nasledovne:
- Otvorte inkognito okno prehliadača (aby ste eliminovali vplyv rozšírení prehliadača).
- Otvorte DevTools (F12 alebo Cmd + Option + I) a prejdite na kartu Performance.
- V nastaveniach panelu (ikona ozubeného kolieska vpravo hore) nastavte CPU Throttling na 4x slowdown (alebo 6x slowdown). Týmto nasimulujete bežný mobilný telefón.
- Kliknite na tlačidlo Record (Nahrávať) v ľavom hornom rohu.
- Vykonajte problematickú interakciu na webe (napr. kliknite na filter produktov alebo na tlačidlo variácie produktu WooCommerce).
- Zastavte nahrávanie kliknutím na Stop.
Analýza nahrávky výkonu
Po spracovaní nahrávky sa zamerajte na nasledujúce sekcie:
- Sekcia Interactions: Chrome DevTools tu vizuálne zobrazuje každú interakciu. Ak svieti červený pruh, interakcia prekročila 200 ms. Po kliknutí na tento pruh uvidíte v spodnom paneli detailný rozpad na Input Delay, Processing Duration a Presentation Delay.
- Sekcia Main Thread (Hlavné vlákno): Hľadajte červené trojuholníky v pravom hornom rohu blokov úloh. Tie označujú „Long Tasks“ (úlohy nad 50 ms). Sledujte hierarchiu volaní (Call Stack) smerom nadol. Uvidíte presný názov funkcie a súboru (napr. jquery.js, add-to-cart-variation.js), ktorý procesor vyťažil.
- Flame Chart (Plameňový graf): Pomáha pochopiť, či čas spracovania zhltol samotný JavaScript (dlhé žlté bloky), alebo či prehliadač strávil stovky miliseúnd v purpurových blokoch (Recalculate Style, Layout) či zelených blokoch (Paint).
Pre detailnejšie informácie o profilovaní aplikácií pomocou Chrome DevTools odporúčame preštudovať oficiálnu príručku Chrome DevTools Performance, ktorá detailne rozoberá analýzu CPU profilov.
4. Praktické techniky optimalizácie JavaScriptu vo WordPresse
Keď identifikujete problematický JavaScript, musíte ho optimalizovať tak, aby uvoľnil hlavné vlákno pre kritické interakcie.
Rozdelenie dlhých úloh (Yielding to the Main Thread)
Ak má váš vlastný skript vykonať zložitú operáciu (napr. prejsť tisíce produktov v poli na strane klienta), nesmie ju spustiť synchrónne v jednom bloku. Musíte „ustúpiť“ (yield) hlavnému vláknu, aby medzičasom mohlo spracovať prípadné kliknutia používateľa.
V modernom JavaScripte sa na tento účel využíva kombinácia Promise a asynchrónneho plánovania úloh pomocou setTimeout alebo moderného API scheduler.yield() (ktoré je už štandardom v moderných prehliadačoch).
Ukážka synchrónneho kódu blokujúceho hlavné vlákno:
function processLargeData(items) {
for (let item of items) {
// Náročný výpočet, ktorý pri 1000+ položkách trvá 150ms
heavyComputation(item);
}
}
Optimalizovaná verzia s ustupovaním hlavnému vláknu (yielding):
// Pomocná funkcia na vytvorenie yield bodu
function yieldToMain() {
return new Promise(resolve => setTimeout(resolve, 0));
}async function processLargeDataOptimized(items) {
let lastYield = performance.now();for (let i = 0; i < items.length; i++) { heavyComputation(items[i]); // Ak spracovanie trvá už viac ako 16 ms (jeden snímok pri 60fps), ustúpime if (performance.now() – lastYield > 16) {
await yieldToMain();
lastYield = performance.now();
}
}
}
Ak prehliadač podporuje natívne metódy prioritizácie úloh, je možné využiť metódu scheduler.postTask(). Podrobnosti o plánovaní úloh na webe nájdete v špecifikácii Prioritized Task Scheduling API.
Správne používanie defer a async vo WordPresse
Načítanie skriptov, ktoré nie sú okamžite potrebné pre zobrazenie kritického obsahu (Above-the-Fold), by malo byť odložené. Tým zabránite tomu, aby prehliadač počas prvého renderovania parsoval a kompiloval megabajty JS kódu, čo drasticky zvyšuje Input Delay hneď po načítaní.
Vo WordPresse môžete pridať atribúty defer alebo async k registrovaným skriptom pomocou filtra script_loader_tag:
function wp_optimize_js_attributes($tag, $handle, $src) {
// Zoznam skriptov, ktoré chceme odložiť (deferred)
$defer_scripts = [
‚woocommerce-general‘,
‚mailchimp-for-wp‘,
‚contact-form-7‘
];if (in_array($handle, $defer_scripts)) {
return ‚‚ . „\n“;
}
return $tag;
}
add_filter(‚script_loader_tag‘, ‚wp_optimize_js_attributes‘, 10, 3);
Poznámka: Používajte defer pre skripty, ktoré závisia od iných skriptov (napríklad pluginy závislé na jQuery), pretože si zachovávajú poradie vykonávania. async použite pre nezávislé skripty tretích strán (napr. analytika).
Optimalizácia obsluhy udalostí (Debouncing a Throttling)
Pri udalostiach, ktoré sa spúšťajú s vysokou frekvenciou (napr. scrolling, zmena veľkosti okna resize, písanie do vyhľadávacieho poľa keyup), musíte zabrániť tomu, aby sa váš event handler vykonával pri každom jednom mikromomente.
- Debouncing (Odskok): Zaistí, že sa funkcia spustí až po uplynutí určitej doby nečinnosti. Ideálne pre live-search vo WooCommerce.
- Throttling (Škrtenie): Zaistí, že sa funkcia spustí maximálne raz za definovaný časový interval (napr. každých 100 ms). Ideálne pre scrollovanie.
Príklad debouncingu pre vyhľadávacie pole WooCommerce:
function debounce(func, delay) {
let timeoutId;
return function(…args) {
clearTimeout(timeoutId);
timeoutId = setTimeout(() => {
func.apply(this, args);
}, delay);
};
}const searchInput = document.querySelector(‚.search-field‘);
if (searchInput) {
searchInput.addEventListener(‚input‘, debounce((event) => {
// Spustí AJAX vyhľadávanie až 300ms po dokončení písania
triggerWooCommerceSearch(event.target.value);
}, 300));
}
5. Optimalizácia WooCommerce špecifických procesov
WooCommerce prináša špecifický set problémov, ktoré priamo ovplyvňujú metriku INP. Zameriame sa na tri najkritickejšie oblasti.
Eliminácia zdržania pri „Pridať do košíka“ (Add-to-Cart)
Predvolené správanie WooCommerce pri AJAX pridaní do košíka spočíva v odoslaní požiadavky na server a následnom čakaní na odpoveď, kým sa zmení stav tlačidla a aktualizuje minikošík. Počas tohto sieťového prenosu (ktorý môže trvať aj sekundu) zákazník často netuší, či systém na kliknutie reagoval.
Riešenie 1: Optimistické aktualizácie používateľského rozhrania (Optimistic UI Update)
Miesto čakania na server ihneď po kliknutí zmeňte stav tlačidla v JavaScripte na „Pridávanie…“ a vizuálne naznačte aktivitu (napr. animáciou spinneru alebo zmenou farby tlačidla). Prehliadač tak okamžite (v priebehu jednotiek miliseúnd) vykreslí nový rámec (Next Paint), čím udrží INP hlboko pod 200 ms.
jQuery(document.body).on(‚adding_to_cart‘, function(event, $button, data) {
// Okamžitá reakcia na kliknutie ešte pred odoslaním AJAX dopytu
$button.addClass(‚visual-feedback-loading‘);
$button.attr(‚aria-busy‘, ‚true‘);
});
Riešenie 2: Využitie WooCommerce Cart fragmentov s rozumom
WooCommerce využíva systém cart fragments (odporúčaný v starších verziách, no v novších verziách postupne nahradzovaný moderným Block-based košíkom) na aktualizáciu obsahu košíka na všetkých stránkach cez AJAX. Tento mechanizmus odosiela AJAX požiadavku get_refreshed_fragments pri každom načítaní stránky a po každej interakcii s košíkom. Toto správanie masívne blokuje hlavné vlákno a preťažuje WordPress na strane servera.
Ak nepoužívate minikošík v hlavičke na každej podstránke, zakážte načítavanie týchto fragmentov na ne-e-shopových stránkach:
add_action(‚wp_enqueue_scripts‘, ‚dequeue_woocommerce_cart_fragments‘, 99);
function dequeue_woocommerce_cart_fragments() {
if (function_exists(‚is_woocommerce‘) && !is_woocommerce() && !is_cart() && !is_checkout()) {
wp_dequeue_script(‚wc-cart-fragments‘);
}
}
Zrýchlenie reakcie filtrov produktov (Faceted Search)
Filtrovanie produktov na archívnych stránkach WooCommerce je z hľadiska INP kritické. Ak zákazník klikne na filter „Červená farba“ a web zamrzne, kým server nespracuje dopyt a nevykreslí novú stránku, používateľská skúsenosť degraduje.
Ak používate AJAX filtre, uistite sa, že:
- Používate CSS prechod na vizuálne stlmenie (fade out) produktov okamžite po kliknutí (zníženie opacity produktov do 50 ms od interakcie).
- Nepoužívate zložité animácie elementov počas načítavania, ktoré spôsobujú neustály repainting celého DOM-u.
- Využívate klient-side caching (napr. ukladanie výsledkov filtrovania do sessionStorage), aby sa pri opätovnom zakliknutí rovnakého filtra nemusela posielať AJAX požiadavka.
Prepínanie variácií produktov (Variable Products)
Pri produktoch s desiatkami variácií (napr. tričko s 5 veľkosťami, 5 farbami a 2 typmi materiálu) WooCommerce načítava veľký JSON objekt so všetkými kombináciami dát na stranu klienta. JavaScript súbor add-to-cart-variation.js analyzuje tento JSON pri každom výbere atribútu, aby určil cenu, dostupnosť a obrázok danej variácie.
Ak má produkt viac ako 30 variácií, WooCommerce predvolene prepne do režimu AJAX overovania variácií (odosiela dotaz na server namiesto lokálneho spracovania). Tento limit môžete upraviť pomocou filtra woocommerce_ajax_variation_threshold:
add_filter(‚woocommerce_ajax_variation_threshold‘, ‚custom_ajax_variation_threshold‘, 10, 2);
function custom_ajax_variation_threshold($qty, $product) {
// Zvýšením limitu spracujeme viac variácií na strane klienta (rýchlejšia odozva, ak má používateľ silné zariadenie)
// Znížením limitu naopak uľavíme klientovi, no zaťažíme server AJAX dopytmi
return 50;
}
Pre zníženie INP pri produktoch s extrémnym počtom variácií (nad 100) sa odporúča optimalizovať JSON dáta, ktoré WooCommerce generuje. Môžete odstrániť nepotrebné metadáta z poľa variácií pomocou filtra woocommerce_available_variation.
6. CSS a DOM optimalizácie na zníženie Presentation Delay
Keď JavaScript dokončí spracovanie eventu, prehliadač musí zmeny premietnuť na obrazovku. Ak je táto fáza pomalá, máte vysoké Presentation Delay.
Redukcia veľkosti a hĺbky DOM
Každý uzol (node) v DOM strome spotrebováva pamäť a spomaľuje výpočty štýlov. Na zníženie veľkosti DOM vo WordPresse urobte nasledovné:
- Vyhýbajte sa zbytočnému obaľovaniu (wrapper nesting) elementov v page builderoch. Elementor a podobné nástroje často vytvárajú hlboké štruktúry typu div > div > div > div > p. Ak je to možné, používajte inline nastavenia CSS Grid alebo Flexbox priamo na kontajneroch a eliminujte nadbytočné stĺpce a vnútorné sekcie.
- Používajte stránkovanie (pagination) alebo inteligentné lazy-loading riešenia. Nezobrazujte 100 produktov na jednej archívnej stránke WooCommerce. Nastavte limit na 12 až 24 produktov.
Využitie vlastnosti content-visibility
Moderné CSS ponúka vlastnosť content-visibility, ktorá umožňuje prehliadaču preskočiť vykresľovanie a prepočty layoutu pre prvky mimo obrazovky (off-screen). To dramaticky zrýchľuje interakcie na stránke, pretože prehliadač nemusí prepočítavať pozíciu prvkov v pätičke alebo v skrytých častiach webu, keď používateľ interaguje s hlavičkou.
Príklad aplikácie pre pätičku webu a komentáre:
.site-footer {
content-visibility: auto;
contain-intrinsic-size: 1000px; /* Približná výška elementu na zamedzenie posunu obsahu */
}.woocommerce-tabs {
content-visibility: auto;
contain-intrinsic-size: 500px;
}
Prevencia „Layout Thrashing“ (Vynútený synchrónny reflow)
K Layout Thrashingu dochádza vtedy, keď JavaScript v rámci jednej úlohy opakovane číta vlastnosti layoutu z DOM-u a následne ich zapisuje. Prehliadač je tak nútený po každom zápise okamžite prepočítať layout, aby poskytol presné hodnoty pre nasledujúce čítanie.
Chybný prístup (spôsobuje layout thrashing):
// Prehliadač musí opakovane počítať layout v cykle
for (let i = 0; i < elements.length; i++) {
let width = elements[i].offsetWidth; // ČÍTANIE (Layout recalculation)
elements[i].style.margin = (width / 2) + ‚px‘; // ZÁPIS (Invaliduje layout)
}
Správny prístup (oddelenie čítania a zápisu):
// Najprv vykonáme všetky čítania
const widths = elements.map(el => el.offsetWidth);// Následne vykonáme všetky zápisy
elements.forEach((el, index) => {
el.style.margin = (widths[index] / 2) + ‚px‘;
});
Ak pracujete s komplexnými animáciami alebo manipuláciami s DOM, odporúča sa použiť API requestAnimationFrame, ktoré zaručí, že sa zápisy do DOM vykonajú presne pred ďalším vykreslením snímky prehliadačom.
Pre hlbšie pochopenie renderingu v prehliadačoch odporúčame preštudovať si špecifikáciu CSS Containment Module Level 2, ktorá definuje mechanizmy izolácie častí stránky pre optimalizáciu výkonu vykresľovania.
7. Prípadová štúdia: Optimalizácia WooCommerce archívu produktov
Predstavme si reálny WooCommerce e-shop, ktorý predáva oblečenie. Na archívnej stránke kategórie (obsahujúcej 36 produktov s povoleným AJAX filtrovaním a minikošíkom v hlavičke) bol nameraný INP na mobilných zariadeniach vo výške 480 ms (v pásme „Vyžaduje zlepšenie“).
Pôvodný stav a diagnostika cez Performance Panel
- Pri kliknutí na filter „Veľkosť XL“ zaznamenal Performance panel nasledovný priebeh:
- Input Delay (120 ms): Hlavné vlákno bolo blokované prebiehajúcim parsovaním JavaScriptu od chatovacieho widgetu tretej strany, ktorý sa načítaval asynchrónne, no spustil sa presne v momente, kedy používateľ začal scrolovať a vyberať filtre.
- Processing Time (280 ms): Filter po kliknutí zavolal synchrónny jQuery skript, ktorý zozbieral vybrané atribúty, odoslal AJAX na /wp-admin/admin-ajax.php a po prijatí odpovede kompletne zmazal a znova vybudoval DOM pre celú sekciu produktov (vrátane reinicializácie skriptov pre lazy-loading obrázkov).
Presentation Delay (80 ms): Veľkosť DOM dosahovala 4 200 uzlov, čo viedlo k pomalému prepočtu štýlov po nahradení HTML kódu.
Implementované kroky a kódové zmeny
- Krok 1: Odloženie načítania chatovacieho widgetu (Input Delay)
Načítanie externého chatu bolo kompletne odložené, kým používateľ nevykoná prvú fyzickú interakciu s webom (napríklad posunutie stránky o viac ako 100px alebo kliknutie).
let chatLoaded = false;
function loadChatWidget() {
if (chatLoaded) return;
chatLoaded = true;// Načítanie externého skriptu
const script = document.createElement(‚script‘);
script.src = ‚https://cdn.thirdparty.com/chat-widget.js‘;
script.async = true;
document.body.appendChild(script);// Odstránenie event listenerov
window.removeEventListener(‚scroll‘, loadChatWidget);
document.removeEventListener(‚pointerdown‘, loadChatWidget);
}window.addEventListener(‚scroll‘, loadChatWidget, { passive: true });
document.addEventListener(‚pointerdown‘, loadChatWidget, { passive: true });
- Krok 2: Optimistický prechod filtrov (Processing Time)
Hneď po kliknutí na filter JavaScript pridal triedu .filtering-active na kontajner produktov, čím sa vizuálne aplikoval CSS filter opacity bez zmeny rozloženia prvkov. Tým sa vytvoril „Next Paint“ do 30 ms.
const filterCheckboxes = document.querySelectorAll(‚.product-filter-checkbox‘);
filterCheckboxes.forEach(checkbox => {
checkbox.addEventListener(‚change‘, () => {
const productContainer = document.querySelector(‚.products-grid‘);
if (productContainer) {
// Okamžitá vizuálna spätná väzba (INP vyriešené!)
productContainer.classList.add(‚loading-state-opacity‘);
}
});
});
- Krok 3: Prepísanie DOM manipulácie (Presentation Delay)
Namiesto úplného nahradenia celého HTML kódu produktovej mriežky (čo ničilo existujúce event listenery a nútilo prehliadač prepočítavať celý DOM strom) bol implementovaný diffing algoritmus na strane klienta. Nové produkty boli porovnané s existujúcimi a aktualizovali sa len tie časti DOM-u, ktoré sa skutočne zmenili (napr. názvy, obrázky a ceny konkrétnych kariet produktov).
Výsledky optimalizácie
Po nasadení týchto zmien bol vykonaný opätovný test v Chrome DevTools so zapnutým 4x CPU Throttlingom.
- Input Delay klesol zo 120 ms na 15 ms (vďaka odstráneniu blokujúceho chatovacieho JS).
- Processing Time klesol z 280 ms na 45 ms (vďaka okamžitému priradeniu CSS triedy a asynchrónnemu spracovaniu AJAX-u mimo hlavného vlákna).
- Presentation Delay klesol z 80 ms na 20 ms (vďaka šetrnejšej manipulácii s DOM a zníženiu hĺbky DOM stromu).
Celková hodnota INP po optimalizácii klesla na 80 ms na mobilných zariadeniach, čo bezpečne zaradilo web do zeleného pásma „Good“ a viedlo k nárastu konverzného pomeru na e-shope o 4.2 % v priebehu nasledujúcich 30 dní.
8. Záver a kontrolný zoznam (Checklist) pre vývojárov
Optimalizácia Interaction to Next Paint (INP) nie je jednorazová záležitosť, ale neustály proces dohľadu nad kvalitou kódu a výberom pluginov vo WordPress a WooCommerce. Každý nový riadok JavaScriptu, ktorý do systému pridáte, môže mať negatívny vplyv na odozvu webu na kliknutie.
Na udržanie nízkych hodnôt INP odporúčame implementovať nasledujúce overené postupy do vášho workflowu:
- Predchádzajte zbytočnému preťažovaniu hlavného vlákna — analyzujte každú novú knižnicu alebo plugin tretej strany. Ak nie je pre základný beh webu nevyhnutný, odložte jeho načítanie.
- Poskytujte okamžitú spätnú väzbu — ak používateľ na niečo klikne, zmeňte stav tlačidla, zobrazte spinner alebo stlmte obsah do 50 ms. Serverový proces môže trvať dlhšie, ale používateľ musí vidieť, že systém na jeho podnet reaguje.
- Rozdeľujte dlhé úlohy v JavaScripte — využívajte asynchrónne programovanie, Promise a techniku ustupovania hlavnému vláknu (setTimeout, scheduler.yield()) pri náročných operáciách.
- Udržiavajte čistý a plytký DOM — minimalizujte hniezdenie elementov v page builderoch a nepoužívajte zbytočné wrappery. Využívajte moderné CSS vlastnosti ako content-visibility na uľahčenie práce vykresľovacieho jadra prehliadača.
- Monitorujte reálne dáta — nespoliehajte sa len na syntetické testy vo vašom prehliadači. Implementujte zber dát cez web-vitals.js do GA4 a pravidelne kontrolujte sekciu Core Web Vitals v Google Search Console.
Sústredením sa na plynulosť a okamžitú odozvu vášho WordPress a WooCommerce webu nielen uspokojíte algoritmy vyhľadávača Google, ale predovšetkým poskytnete vašim zákazníkom rýchly, responzívny a moderný nákupný zážitok, ktorý priamo podporí ich vernosť a ochotu nakupovať znova.
Odkazy na odborné zdroje:
Google Web Vitals – Interaction to Next Paint (INP) — Oficiálna dokumentácia metriky INP od tímu Chrome.
W3C HTML Standard – Task Scheduling — Technická špecifikácia plánovania úloh v prehliadačoch.
W3C CSS Containment Module Level 2 Specification — Špecifikácia pre riadenie vykresľovania a znižovanie Presentation Delay.
Chrome DevTools Performance Documentation — Oficiálny sprievodca pre profilovanie a diagnostiku webovej aplikácie.
Prioritized Task Scheduling API (WICG) — Špecifikácia API pre moderné asynchrónne plánovanie úloh a yielding.










