⚡ Метрики Core Web Vitals
-
Перевірте Largest Contentful Paint (LCP)
Чому: LCP показує, наскільки швидко з’являється основний контент. Повільний LCP робить сторінку «важкою».
Як перевірити: Відкрийте Chrome DevTools → Lighthouse → Згенерувати звіт; значення LCP має бути ≤ 2.5 c.
Як впровадити:- Попередньо завантажте ключові зображення:
<link rel="preload" href="/images/hero.jpg" as="image">
- Стисніть зображення: скористайтеся Squoosh або ImageMagick, щоб зменшити розмір.
- Використовуйте сучасні формати: конвертуйте JPEG/PNG у WebP:
cwebp input.png -o output.webp
- Попередньо завантажте ключові зображення:
-
Перевірте Total Blocking Time (TBT) як проксі FID
Чому: TBT показує, як довго блокується головний потік. Нижчий TBT — швидший відгук на кліки.
Як перевірити: Запустіть Lighthouse у DevTools; «Total Blocking Time» має бути ≤ 200 мс.
Як впровадити:- Відкладіть не критичні скрипти:
<script src="analytics.js" defer></script>
- Розбийте великі JS-бандли:
import('./heavy-module.js').then(module => { /* … */ });
- Переносьте довгі задачі у Web Worker:
const worker = new Worker('worker.js');
- Відкладіть не критичні скрипти:
-
Перевірте Cumulative Layout Shift (CLS)
Чому: CLS показує візуальну стабільність. Високий CLS викликає «стрибки» елементів і дратує користувачів.
Як перевірити: Звіт Lighthouse → «Cumulative Layout Shift» (≤ 0.1). DevTools → Performance → Record → шукайте події Layout Shift.
Як впровадити:- Задавайте width/height для зображень:
<img src="logo.png" width="200" height="100" alt="Логотип">
- Резервуйте місце під рекламу: додайте порожній
<div>
фіксованого розміру перед завантаженням банера. - Використовуйте font-display:
@font-face { font-family: 'MyFont'; src: url('myfont.woff2') format('woff2'); font-display: swap; }
- Задавайте width/height для зображень:
🖼️ Зображення та медіа для Core Web Vitals
-
Оптимізуйте та стисніть зображення
Чому: Великі зображення сповільнюють завантаження та погіршують LCP.
Як перевірити: DevTools → Network → фільтр «Img» → сортуйте за розміром.
Як впровадити:- Скористайтеся Squoosh: збережіть із якістю ~70 %.
- Подавайте WebP:
<picture> <source type="image/webp" srcset="image.webp"> <img src="image.jpg" alt="Зображення"> </picture>
-
Використовуйте адаптивні зображення
Чому: Користувач завантажує лише потрібний розмір, економлячи байти.
Як перевірити: Перегляньте теги<img>
; переконайтеся, що присутніsrcset
іsizes
.
Як впровадити:<img src="small.jpg" srcset="small.jpg 400w, medium.jpg 800w, large.jpg 1200w" sizes="(max-width: 600px) 400px, 800px" alt="Зображення">
-
Ліниве завантаження позаекранних медіа
Чому: Відкладене завантаження зображень/відео поза видимою частиною пришвидшує стартову загрузку.
Як перевірити: DevTools → Network → прокрутіть сторінку → дивіться, коли вантажаться зображення.
Як впровадити:<img src="photo.jpg" loading="lazy" alt="Фото"> <iframe src="video.html" loading="lazy"></iframe>
-
Подавайте зображення AVIF
Чому: AVIF часто стискається краще за WebP чи JPEG, даючи менші файли та швидший LCP.
Як перевірити: DevTools → Network → фільтр «Img» → порівняйте розміри.avif
і.webp
/.jpg
.
Як впровадити:<picture> <source type="image/avif" srcset="hero.avif"> <source type="image/webp" srcset="hero.webp"> <img src="hero.jpg" alt="Головне зображення"> </picture>
🎨 Оптимізація CSS для Core Web Vitals
-
Мініфікуйте CSS
Чому: Менші CSS-файли швидше завантажуються.
Як перевірити: DevTools → Network → фільтр «CSS» → дивіться розміри.
Як впровадити: Підключіть cssnano у збірці:postcss([require('cssnano')]).process(css).then(result => { … });
-
Видаліть невикористаний CSS
Чому: Зайвий CSS — марні байти.
Як перевірити: DevTools → вкладка Coverage → Reload → дивіться % невикористаного CSS.
Як впровадити: Використовуйте PurgeCSS:purgecss({ content: ['./src/**/*.html', './src/**/*.js'], css: ['./src/styles.css'] });
-
Інлайн критичний CSS
Чому: Inline-стилі вище фолду прискорюють перше відмалювання.
Як перевірити: Lighthouse → «Eliminate render-blocking resources».
Як впровадити: Витягніть критичний CSS (вручну або через Critical CLI):npx critical index.html --inline --minify
🚀 Оптимізація JavaScript для Core Web Vitals
-
Мініфікуйте та стискайте JS
Чому: Менше JS — швидше парсинг і завантаження.
Як перевірити: DevTools → Network → сортуйте «JS» за розміром.
Як впровадити: Використовуйте Terser:terser input.js -o output.min.js --compress --mangle
-
Defer або Async для не критичних скриптів
Чому: Запобігає блокуванню рендеру важкими скриптами.
Як перевірити: Перегляньте вихідний код: чи мають скриптиdefer
абоasync
?
Як впровадити:<script src="widget.js" async></script> <script src="main.js" defer></script>
-
Видаліть невикористаний JS
Чому: «Мертвий» код збільшує розмір бандлу.
Як перевірити: DevTools → Coverage → знайдіть невикористаний код.
Як впровадити: Tree-shaking у Webpack або Rollup із ES-модулями. -
Використовуйте пасивні event-listeners
Чому: Пасивні слухачі покращують скрол та зменшують затримку введення.
Як перевірити: DevTools → Performance → Record → шукайте non-passive «Listener».
Як впровадити:document.addEventListener('scroll', onScroll, { passive: true });
🎯 Пріоритизація ресурсів для Core Web Vitals
-
Preload ключових ресурсів
Чому: Дозволяє браузеру завчасно завантажити критичні файли.
Як перевірити: Lighthouse → «Preload key requests».
Як впровадити:<link rel="preload" href="fonts/myfont.woff2" as="font" type="font/woff2" crossorigin>
-
Використовуйте HTTP/2 або HTTP/3
Чому: Мультиплексування зменшує час завантаження.
Як перевірити: DevTools → Network → стовпчик Protocol.
Як впровадити: Увімкніть HTTP/2 у конфігурації сервера (Nginx:listen 443 ssl http2;
). -
DNS-Prefetch та Preconnect
Чому: Ранній DNS та TLS скорочує затримки.
Як перевірити: DevTools → Network → знайдіть пізні DNS-запити.
Як впровадити:<link rel="dns-prefetch" href="//example.com"> <link rel="preconnect" href="https://example.com" crossorigin>
🔤 Шрифти для Core Web Vitals
-
Preload та оптимізація шрифтів
Чому: Зменшує зміщення макета й затримки при завантаженні тексту.
Як перевірити: Lighthouse → «Ensure text remains visible during webfont load».
Як впровадити:<link rel="preload" href="fonts/Roboto.woff2" as="font" type="font/woff2" crossorigin> font-display: swap;
🌐 Сервер і кешування для Core Web Vitals
-
Зменшіть TTFB (Time to First Byte)
Чому: Швидкий TTFB покращує всі метрики.
Як перевірити: DevTools → Network → «Waiting (TTFB)».
Як впровадити: Використовуйте CDN (Cloudflare) і оптимізуйте кеш БД/бекенду. -
Увімкніть GZIP або Brotli-компресію
Чому: Стислі файли передаються швидше.
Як перевірити: Перегляньте заголовок відповідіcontent-encoding: gzip
/br
.
Як впровадити: Приклад Nginx:gzip on; gzip_types text/css application/javascript;
-
Налаштуйте Cache-Control
Чому: Браузер повторно використовує ресурси при наступних відвідинах.
Як перевірити: Заголовок відповідіCache-Control
.
Як впровадити: Приклад:Cache-Control: public, max-age=31536000, immutable
🤖 Сторонні скрипти для Core Web Vitals
-
Перевірте та обмежте сторонній код
Чому: Реклама й віджети можуть блокувати рендер.
Як перевірити: DevTools → Network → фільтруйте за доменами третіх сторін.
Як впровадити: Видаліть непотрібні віджети та ліниво підвантажуйте аналітику після події load.
🧩 DOM і рендеринг для Core Web Vitals
-
Скоротіть розмір DOM
Чому: Великий DOM уповільнює рендер і виконання JS.
Як перевірити: DevTools → Elements → підрахуйте вузли.
Як впровадити: Спрощуйте HTML і видаляйте приховані/невикористані елементи. -
Уникайте layout-thrashing
Чому: Повторні читання/записи змушують браузер робити зайві перерахунки макета.
Як перевірити: DevTools → Performance → шукайте «Forced reflow».
Як впровадити: Групуйте читання і запис окремо:// ПОГАНО element.style.width = element.offsetWidth + 'px'; // ДОБРЕ const w = element.offsetWidth; element.style.width = w + 'px';
🧰 Інструменти моніторингу та тестування для Core Web Vitals
-
Використовуйте Lighthouse
Чому: Автоматичний аудит Core Web Vitals.
Як перевірити: DevTools → Lighthouse → Run.
Як впровадити: Інтегруйте в CI через lighthouse-ci. -
Використовуйте PageSpeed Insights
Чому: Польові й лабораторні дані в одному місці.
Як перевірити: Перейдіть на PageSpeed Insights → введіть URL.
Як впровадити: Проаналізуйте поради та застосуйте пункти цього чеклисту. -
Налаштуйте Real User Monitoring (RUM)
Чому: Відстежує реальну продуктивність очима користувачів.
Як перевірити: Підключіть Web Vitals library та дивіться логи в консолі.
Як впровадити:<script src="https://unpkg.com/[email protected]/dist/web-vitals.iife.js"></script> <script> webVitals.getLCP(console.log); webVitals.getFID(console.log); webVitals.getCLS(console.log); </script>
-
Тестуйте через WebPageTest
Чому: WebPageTest надає детальні waterfall, filmstrip і метрики з реальних пристроїв.
Як перевірити: Перейдіть на webpagetest.org, введіть URL, оберіть пристрій і канал, запустіть тест.
Як впровадити: Перевіряйте First Contentful Paint, Speed Index та скриптуйте регулярні тести через API WebPageTest.
📊 Бюджети продуктивності для Core Web Vitals
-
Визначте бюджети продуктивності
Чому: Бюджети чітко обмежують регресії раніше.
Як перевірити: У логах збірки/CI дивіться, чи перевищені розміри бандлів або бали Lighthouse.
Як впровадити: Приклад Webpack:module.exports = { performance: { maxAssetSize: 150000, maxEntrypointSize: 300000 } };
-
Контролюйте бюджети в CI
Чому: Автоматична перевірка не допустить поганий код у main.
Як перевірити: CI має падати, якщо бюджети перевищено.
Як впровадити: Пакунок bundlesize:"scripts": { "bundlesize": "bundlesize" }, "bundlesize": [ { "path": "dist/*.js", "maxSize": "150 kB" } ]