Як покращити INP: знайдіть повільну взаємодію до зміни коду
Кнопка реагує із затримкою, хоча сторінка вже завантажилася. Зменшення бандла навмання або ранній спінер не встановлюють причину й не доводять, що дія завершується правильно. Почніть із конкретної взаємодії: зіставте її з trace, знайдіть затримку до обробки, усередині обробника чи перед відображенням. Далі змініть один механізм і перевірте не тільки відгук, а й корисний результат. Цей матеріал призначений для розробників і технічних SEO, які можуть записати сценарій у браузері та перевірити змінену збірку. Доданий стенд показує різницю між синхронним виконанням, yield і резервним таймером без підключення до робочих даних.
Відгук і завершення — два окремі результати перевірки.
Одна взаємодія → trace → зміна → перевірка
Дослідження 01
Перетворіть попередження INP на дію, яку можна відтворити
Починати варто з повільної дії, а не з бажаного розміру бандла. Interaction to Next Paint (INP) вимірює відгук у Core Web Vitals: від кліку, дотику або клавіатурного вводу до наступного відображення. Польова оцінка використовує 75-й перцентиль окремо для мобільних і десктопних користувачів: до 200 мс включно — добре, понад 200 до 500 мс — потребує покращення, понад 500 мс — погано. Межі класифікують результат, але не визначають проблемну функцію.
Джерела:[2] web.dev
Оберіть сценарій із конкретним збоєм: меню не відкривається під час ініціалізації сторінки, фільтр зависає після прокручування каталогу або форма довго показує помилки. Запишіть маршрут, початковий стан, введені дані, очікувану реакцію та момент виникнення проблеми. Запис бездіяльної сторінки не перевіряє скаргу на фільтр, яким користуються через кілька хвилин після завантаження.
Якщо є атрибуція реальних взаємодій, використайте її для вибору сценарію. Збірка web-vitals з атрибуцією надає ціль взаємодії та її складові: input delay, processing duration і presentation delay. Перед додаванням вимірювань перевірте версію бібліотеки та правила збору. Краще передавати дозволену назву компонента, ніж текст або селектор із даними користувача; значення полів форми не повинні потрапляти в телеметрію.
Джерела:[5] web.dev
Запишіть саму дію, а не лише завантаження
Підготуйте початковий стан
Відкрийте Chrome DevTools → Performance. Зафіксуйте viewport, throttling, версію браузера та стан застосунку. Не змінюйте ці умови під час порівняння.
Очікуваний результат: Базовий запис описує відтворюваний сценарій, а не оцінку без контексту.
Запишіть підозрілу дію
Натисніть Record, виконайте дію, дочекайтеся видимого результату та зупиніть запис. Знайдіть її в Interactions, наведіть курсор і відкрийте Summary.
Очікуваний результат: У записі є потрібна взаємодія та її інтервали input, processing і presentation.
Зіставте затримку з роботою
Збільште відповідний фрагмент і перевірте Main. Збережіть trace та назвіть обробник, попередню задачу або роботу рендерингу, яку будете перевіряти.
Очікуваний результат: Підозріла робота збігається з потрібним інтервалом. Довга задача в іншій частині запису не вважається встановленою причиною.
Джерела:[4] Chrome for Developers
Джерела:[10] Chrome for Developers
Різницю між польовими даними URL, даними origin і синтетичним тестуванням розібрано в гайді з перевірки Core Web Vitals. Тут завдання вужче: знайти повільну взаємодію, змінити одну причину та перевірити правильність завершення дії.
Дослідження 02
Знайдіть складову затримки, перш ніж змінювати код
Читайте взаємодію зліва направо. Input delay — очікування до початку обробників події. Processing duration охоплює виконання обробників. Presentation delay — проміжок після них до відображення наступного кадру. Зміна не тієї складової може прибрати частину коду, але залишити відчутну для користувача затримку.
Джерела:[3] web.dev
Одна взаємодія — три різні ділянки пошуку
Складові розташовано в порядку виконання, без масштабу тривалості. Виміряних значень у схемі немає.
- ОЧІКУВАННЯInput delay
Ввід уже надійшов, обробники ще не почалися.
- ОБРОБКАProcessing duration
Виконуються обробники подій.
- ВІДОБРАЖЕННЯPresentation delay
Обробники завершилися, наступного кадру ще не видно.
Джерела:[3] web.dev
| Основна складова | Який доказ шукати | Перевірка однієї гіпотези |
|---|---|---|
| Input delay | Main зайнятий задачею безпосередньо перед обробниками. | Відкладіть саме цю задачу в тестовій збірці та повторіть ту саму ранню дію. |
| Processing duration | Вибраний обробник виконує дорогу роботу. | Замініть або розбийте її, не змінюючи вхід і потрібний результат. |
| Presentation delay | Обробник завершився, але кадр затримує рендеринг. | Скоротіть роботу з DOM/стилями та перевірте доступність того самого вмісту. |
Не класифікуйте роботу лише за назвою. Читання геометрії після зміни стилів може примусово запустити layout усередині JavaScript-обробника. Тому витрати на рендеринг іноді входять до processing duration. Перевірте стек і дані forced reflow, а не відносьте будь-який layout до presentation delay.
Сформулюйте гіпотезу так, щоб її можна було відхилити. «У застосунку забагато JavaScript» — не перевірка. «Фільтр синхронно сортує весь набір до підтвердження вибору» — уже перевірка: залиште ті самі дані й вибір, змініть планування сортування та звірте затримку і кінцевий порядок. Швидша взаємодія з неправильним результатом означає невдалу зміну.
Дослідження 03
Звільняйте головний потік, не втрачаючи контроль над дією
Коли обробник виконує великий синхронний блок, поділ на дрібні функції не дає браузеру нового моменту для планування. Вони залишаються в тій самій задачі. Уже виконаний promise також не заміна: продовження потрапляє до microtask-черги, яка обробляється до можливої роботи над відображенням.
Джерела:[1] MDN Web Docs[7] web.dev
Навчальний стенд використовує scheduler.yield(), якщо API доступний, і таймер в іншому разі. Перевірка підтримки — частина реалізації: MDN досі позначає обмежену доступність API. Обидва варіанти продовжують роботу в пізнішій задачі, але не мають однакових пріоритетів планування.
Функція планування зі стенда
javascript · VERIFIEDfunction yieldToBrowser(forceTimer = false) {
if (!forceTimer && typeof globalThis.scheduler?.yield === 'function') {
return globalThis.scheduler.yield();
}
return new Promise(resolve => setTimeout(resolve, 0));
}VERIFIED у складі lab.js у Chromium 144.0.7559.96 через локальне DOM-середовище. Викликайте з await усередині async-операції. Гілку з таймером також виконано. Перевірка підтверджує роботу коду й однаковий результат, а не покращення INP на робочому сайті.
У повному прикладі запуск перевіряє обсяг роботи, встановлює стан busy та не дозволяє другому запуску перезаписати його дані. Режим із yield показує прогрес між частинами роботи. Кооперативне скасування відкидає частковий результат; контрольна сума з’являється лише після повного завершення. Завершальна обробка відновлює кнопки навіть за помилки. Ці умови важливіші за скорочення допоміжної функції на один рядок.
Yield не обіцяє й того, що перед продовженням відпрацюють усі таймери. Нативний API надає продовженням інший пріоритет, ніж звичайним задачам таймерів. Перевіряйте дію, яка має залишатися доступною, наприклад Cancel або наступну зміну фільтра. Кількість викликів yield не є результатом оптимізації.
Джерела:[11] Chrome for Developers
У робочому компоненті визначте, хто скасовує операцію після зміни маршруту, який стан дозволено читати між частинами та як новий запит замінює старий. Yield створює моменти, коли може втрутитися інша робота. Не випускайте зміну, доки не продумані проміжні стани та немає захисту від перезапису поточного представлення застарілим результатом.
Дослідження 04
Виконайте експеримент із результатом, який можна звірити
Завантажте стенд для дослідження взаємодій. Усередині — HTML, CSS, JavaScript, аркуш вимірювань та інструкція. Зовнішніх скриптів і телеметрії немає. Відкрийте index.html із розпакованої папки; якщо політики браузера забороняють локальні файли, використайте свій локальний сервер розробки. Код перевірено в DOM-середовищі, а не через production HTTP-маршрут.
Порівняйте три способи виконання тієї самої роботи
Зафіксуйте обсяг
Задайте однакову кількість елементів для Blocking, Yielding і Timer fallback. Почніть із невеликої та збільшуйте, доки запис не стане показовим на вашому пристрої.
Очікуваний результат: Усі завершені режими обробляють однакову кількість елементів і дають ту саму контрольну суму.
Запишіть кожен запуск
У DevTools Performance запишіть натискання Run і роботу до завершення. Зіставте вибрану взаємодію, подальше навантаження Main і кінцевий результат.
Очікуваний результат: Раніше підтвердження дії відокремлено від раннього завершення. Лічильник elapsed не сприймається як INP.
Спробуйте перервати роботу
Під час достатньо довгого yielding-запуску скористайтеся Ping, потім Cancel. Повторіть активацію клавіатурою та запустіть нову операцію після скасування.
Очікуваний результат: Ping оновлюється, часткова сума відкидається, кнопки знову доступні. Недоступний Cancel означає, що перевірку зручності не пройдено.
Перевірте резервний шлях
Запустіть Timer fallback навіть у браузері з підтримкою scheduler.yield(). Повторіть перевірку результату й скасування.
Очікуваний результат: Правильність не залежить від наявності нативного API.
Швидке підтвердження ще не означає завершеної операції
Простежте першу реакцію та кінцевий корисний результат. Смуги показують відповідальність, а не виміряну тривалість.
- ВІДГУКПідтвердити ввід
Показати прийняту дію або правдивий busy-стан. Перевірити вибрану взаємодію.
- ВИКОНАННЯВиконати потрібну роботу
Залишити доступними наступні дії, скасування та узгоджений стан.
- РЕЗУЛЬТАТНадати придатний результат
Звірити дані, кінцевий інтерфейс, фокус і помилки. Окремо записати завершення.
Джерела:[2] web.dev
У доданій функціональній перевірці всі три режими завершили 10 000 елементів із сумою 2364371375. Нативний yield і примусова гілка таймера виконувалися у Chromium 144.0.7559.96. Запланована тестова дія високого пріоритету перевірила Ping і скасування; некоректний обсяг роботи було відхилено. Це синтетична перевірка правильності, а не польова вибірка, вимірювання Event Timing чи доказ переваги режиму у вашому застосунку.
Дослідження 05
Змініть саму роботу, коли планування не розв’язує проблему
Yield — не причина залишати зайву роботу. Якщо кожен ввід повторно обробляє весь набір даних, спочатку перевірте, чи можна отримати той самий результат із меншими обчисленнями. Коли переважає одна неподільна операція, worker може бути доречнішим за дедалі дрібніші частини навколо неї. Worker не працює з DOM напряму; передавання даних і подальше оновлення головного потоку все одно потрібно спроєктувати.
Джерела:[8] MDN Web Docs
| Що видно в доказах | Що перевірити | Що не можна зламати |
|---|---|---|
| Повторні CPU-обчислення з тим самим входом | Прибрати дублювання або кешувати з явною інвалідацією. | Нові дані не отримують застарілий результат; пам’ять не зростає неконтрольовано. |
| Одна дорога операція без DOM | Перенести обчислення у worker й визначити власника повідомлень. | Запуск, передавання, помилки та кінцеве оновлення не нівелюють виграш. |
| Чергування запису стилів і читання геометрії | Згрупувати читання перед записами там, де це дозволяють залежності. | Layout та адаптивність залишаються правильними після зміни вмісту. |
| Малий ввід перебудовує велике представлення | Оновлювати потрібну ділянку без перебудови стороннього вмісту. | Зберігаються фокус, клавіатурний доступ і доступність контенту. |
| Початкова задача затримує першу дію | Відкласти справді другорядну ініціалізацію в контрольованій збірці. | Функція, потрібна для ранньої взаємодії, вже готова. |
Джерела:[3] web.dev[8] MDN Web Docs[9] Chrome for Developers
Це варіанти для перевірки, а не список одночасних правок. Worker не розв’яже затримку, у якій переважає рендеринг. Спінер не виправить втрачене надсилання форми. Видалення контенту заради коротшого trace змінює завдання користувача. Зберігайте очікуваний результат, коли змінюєте спосіб його отримання.
Оптимізація може перенести нестабільність в інше місце. Якщо відкладений результат розгортає панель, перевірте зарезервоване місце та кінцевий фокус. Несподівані зсуви розібрано в гайді з CLS, а запізнілий основний вміст — у гайді з LCP. Це окремі перевірки: менший INP не підтверджує їх успішність.
Дослідження 06
Закривайте задачу доказами відгуку та завершення
Я б не приймав скриншот меншого числа як критерій випуску. Збережіть разом базовий trace, змінену збірку, точний сценарій та очікуваний результат. Почніть із повторних парних запусків за сталих умов: наприклад, п’ять базових і п’ять змінених як робочу серію, а не доказ статистичної достовірності. Запишіть розкид, а не тільки типовий результат; розбіжні спроби потрібно пояснити, а не видалити.
Використайте аркуш як умову випуску
Повторіть той самий сценарій
Збережіть маршрут, дані, viewport, браузер, CPU/network-налаштування й важливий стан кешу. Додайте traces обох збірок.
Очікуваний результат: Потрібна складова змінюється в очікуваний бік без зміни самого завдання.
Перевірте результат і відновлення
Звірте дані, наступну взаємодію, фокус, скасування, помилку та повторну активацію. Визначте відкат до розширення випуску.
Очікуваний результат: Користувач отримує придатний результат, застосунок відновлюється. Ранньої реакції недостатньо.
Перевірте production-групу
Після випуску зіставте ті самі пристрої й сторінки в наявних польових даних, позначивши дату розгортання. Збережіть показники завершення й помилок поряд із відгуком.
Очікуваний результат: Лабораторний виграш не називається польовим без відповідного підтвердження. Змішана група потребує застереження.
Не усереднюйте перцентилі маршрутів, щоб отримати нібито перцентиль сайту, і не називайте найдовший із кількох ручних кліків production-розподілом INP. Збережіть у задачі рівень вимірювання: одна відтворена взаємодія, польова група сторінок чи звіт origin. Порівняння корисне лише за узгодженого охоплення.
Наступну перевірку почніть з одного trace проблемної дії та назви складової, на яку можете вплинути. Скорочуйте або переплановуйте лише роботу, підтверджену доказами. Виправлення завершене тоді, коли відгук придатний, операція правильна, а відповідні вимірювання після випуску підтверджують зміну, — не тоді, коли раніше з’явився спінер.
Джерела та документація
Дати перевірки наведено біля джерел. Межі тестування коду — поруч із прикладами.
- Using microtasks in JavaScript with queueMicrotask()MDN Web Docs · Перевірено 29 вересня 2026 р.
- Interaction to Next Paint (INP)web.dev · Перевірено 29 вересня 2026 р.
- Optimize Interaction to Next Paintweb.dev · Перевірено 29 вересня 2026 р.
- Performance features referenceChrome for Developers · Перевірено 29 вересня 2026 р.
- Find slow interactions in the fieldweb.dev · Перевірено 29 вересня 2026 р.
- Scheduler: yield() methodMDN Web Docs · Перевірено 29 вересня 2026 р.
- Optimize long tasksweb.dev · Перевірено 29 вересня 2026 р.
- Using Web WorkersMDN Web Docs · Перевірено 29 вересня 2026 р.
- Forced reflowChrome for Developers · Перевірено 29 вересня 2026 р.
- CrUX methodologyChrome for Developers · Перевірено 29 вересня 2026 р.
- Use scheduler.yield() to break up long tasksChrome for Developers · Перевірено 29 вересня 2026 р.
Потрібна перевірка повільної взаємодії?
Почнімо з маршруту, сценарію та запису проблеми. Результат — конкретна зміна з перевіркою відгуку й правильності.
Обговорити продуктивність