Hosszú feladatok felbontása (INP)
Lépésenkénti útmutató, ha az oldal 500 ms-nál lassabban reagál a kattintásra: hosszú feladatok felbontása, a vezérlés visszaadása a böngészőnek.
Ezt a javítási kártyát a riport akkor adja, ha a valódi látogatók INP-értéke (75. percentilis) az 500 ms-os “gyenge” határ fölött van. Az INP azt méri, mennyi idő telik el a kattintás, érintés vagy billentyű és a következő képkocka megjelenése között. Ha a böngésző addig egy hosszú szkriptet futtat, nem tud reagálni.
Valódi látogatók és labor
Szekció neve “Valódi látogatók és labor”A kártya csak a valódi látogatói adatból (CrUX, 28 nap, 75. percentilis) indul ki: INP, valódi látogatók. Laborban az INP nem mérhető jól, mert nem tudható, mikor kattint a látogató; a labor helyettesítője a Labor-TBT, de a kettő eltérhet.
Hogyan mérjük
Szekció neve “Hogyan mérjük”A kártya akkor jelenik meg, ha az INP szigorúan nagyobb 500 ms-nál. Magas súlyosságú. A kódrészlet ugyanaz, mint az INP-teszté; a kártya megjelenésekor a kód csak itt marad, hogy ne ismétlődjön.
Hogyan javítsd
Szekció neve “Hogyan javítsd”- Keresd meg a hosszú feladatokat. A Chrome fejlesztői eszközeiben rögzíts egy Performance-felvételt, és közben végezz el egy lassú interakciót. A hosszú feladatok (50 ms fölöttiek) szürke “Task” sávok; a Bottom-Up fülön, “Group by Activity” nézetben látod, mi viszi el az időt.
- Töröld a fölösleges és harmadik féltől származó szkripteket, vagy halaszd őket (
defer,async). - Bontsd fel a hosszú feladatot. Hosszú ciklusban időnként adj vissza a vezérlést a böngészőnek, így az közben feldolgozhatja a kattintást.
- Először jelenítsd meg a látható választ, és csak utána végezd el a nem sürgős munkát (mentés, számolás, elemzés). Például a beírt szöveg frissítése előbb, a szószámlálás utána.
- Ne olvasd és írd váltogatva a stílusokat egy feladaton belül (layout thrashing).
- Kisebb DOM, a képernyőn kívüli részeknél
content-visibility, és ne állíts elő nagy mennyiségű HTML-t JavaScripttel.
JavaScript
Szekció neve “JavaScript”function yieldToMain() { if (globalThis.scheduler?.yield) { return scheduler.yield(); } return new Promise(resolve => { setTimeout(resolve, 0); });}
async function runJobs(jobQueue) { for (const job of jobQueue) { job(); await yieldToMain(); }}- Hosszú ciklusban hívd meg:
await yieldToMain();, így a böngésző közben reagálhat a kattintásra. - Az
awaitkötelező, mert a hívás csak ütemezi a következő feladatot.Array.prototype.forEach-et ne használj, mert nem várja meg az aszinkron visszahívásokat. - A
scheduler.yield()nem minden böngészőben érhető el (a web.dev szerint Chrome és Edge 129, Firefox 142 óta; Safari nem támogatja). Ahol hiányzik, asetTimeouttartalék is visszaadja a vezérlést, de a folytatás nem kap előnyt az ütemezésben.
Hogyan ellenőrizd
Szekció neve “Hogyan ellenőrizd”- A Performance panelen a hosszú feladatok rövidebbek legyenek, és a kattintás utáni képkocka hamarabb jelenjen meg.
- A laborban a Labor-TBT csökkenése jó jel.
- A valódi hatás a CrUX-ban jelenik meg, 28 napos gördülő időszakban, ezért hetek alatt látszik: INP, valódi látogatók. A PageSpeed Insights is mutatja.
Készült: