Як вебсторінка стає видимою в браузері
Між натисканням Enter в адресному рядку й появою сторінки на екрані минає менше секунди, але за цей час браузер виконує довгий ланцюжок операцій: знаходить сервер, завантажує HTML, розбирає…
Оновлено:
Між натисканням Enter в адресному рядку й появою сторінки на екрані минає менше секунди, але за цей час браузер виконує довгий ланцюжок операцій: знаходить сервер, завантажує HTML, розбирає його, підтягує стилі й скрипти, обчислює, де стоятиме кожен елемент, і малює пікселі. Розуміння цього конвеєра пояснює, чому одні сайти «стрибають» під час завантаження, чому текст іноді з’являється раніше картинок, і що насправді вимірюють показники на кшталт LCP чи CLS у звітах про швидкість.
Від HTML до пікселів: як браузер малює сторінку
- Мережа. Браузер перетворює ім’я домену на IP-адресу через DNS, встановлює TCP-з’єднання і TLS-сеанс, надсилає HTTP-запит і починає отримувати HTML. Кожен із цих кроків — окремий «обхід» до сервера, і на мобільній мережі вони разом можуть зайняти сотні мілісекунд ще до отримання першого байта.
- Розбір HTML → DOM. Отриманий текст перетворюється на дерево об’єктів — Document Object Model. Розбір відбувається потоково, у міру надходження даних. Натрапивши на
<link rel="stylesheet">або<script>, браузер запускає їхнє завантаження. - Розбір CSS → CSSOM. Стилі також перетворюються на дерево правил. Тут ключова особливість: браузер не малює нічого, поки не отримав і не розібрав увесь CSS, підключений у
<head>, бо інакше сторінка на мить з’явилася б без стилів. Тому CSS називають ресурсом, що блокує відображення. - JavaScript. Звичайний
<script>зупиняє розбір HTML, поки скрипт не завантажиться й не виконається, бо він може змінити документ. Атрибутиdeferіasyncзнімають це блокування. - Дерево відображення й компонування (layout). DOM і CSSOM поєднуються: для кожного видимого елемента обчислюються розмір і позиція. Зміна розміру одного блоку може зсунути всі наступні — це і є «перекомпонування» (reflow), одна з найдорожчих операцій.
- Малювання й композиція. Елементи перетворюються на пікселі шарами, які потім поєднуються — часто на GPU. Анімації через
transformіopacityзачіпають лише композицію, тому вони плавні; анімація ширини чи позиції запускає компонування заново на кожному кадрі.
Критичний шлях відображення
Мінімальний набір ресурсів, без яких браузер не може показати перший вміст, називають критичним шляхом: HTML, блокуючий CSS і синхронні скрипти в <head>. Чим довший ланцюжок (HTML → CSS → ще один CSS, імпортований із першого → шрифт), тим пізніше з’явиться сторінка. Основні прийоми скорочення шляху: вбудувати критичні стилі просто в HTML, а решту завантажити асинхронно; додати скриптам defer; не імпортувати CSS з CSS; заздалегідь з’єднатися з важливими доменами через preconnect; віддавати ресурси з довгим кешем.
Що вимірюють показники швидкості
- FCP (First Contentful Paint) — коли з’явився перший текст або зображення. Залежить від часу відповіді сервера і блокуючого CSS.
- LCP (Largest Contentful Paint) — коли з’явився найбільший видимий елемент, зазвичай головне зображення чи заголовок. Це головна метрика сприйнятої швидкості.
- CLS (Cumulative Layout Shift) — наскільки вміст «стрибає» під час завантаження: зображення без заданих розмірів, реклама, що вставляється зверху, шрифти, що змінюють висоту рядків. Нуль — ідеал.
- TBT / INP — скільки головний потік був зайнятий довгими задачами JavaScript і не міг реагувати на натискання.
Показники зі синтетичних тестів (Lighthouse, PageSpeed) — це один запуск на емульованому пристрої; дані реальних користувачів (CrUX) з’являються, коли сайт має достатньо відвідувань з Chrome.
Як прискорити відображення сторінок
- Задавайте
widthіheight(абоaspect-ratio) для зображень і рекламних блоків, щоб браузер зарезервував місце заздалегідь. - Тримайте CSS невеликим, вбудовуйте критичну частину, решту завантажуйте без блокування.
- Скриптам —
defer; сторонні скрипти (аналітика, реклама) підключайте асинхронно й лише потрібні. - Стискайте зображення в сучасні формати й завантажуйте ті, що нижче екрана, з
loading="lazy". - Використовуйте
font-display: swapабо системні шрифти, щоб текст не чекав на завантаження шрифту. - Вимірюйте на реальному телефоні в повільній мережі, а не лише на робочому комп’ютері.
Часті запитання
Чому текст з’являється, а потім змінює шрифт?
Браузер показав системний шрифт, доки завантажувався вебшрифт, а потім замінив. Це компроміс між швидкістю появи тексту і зовнішнім виглядом; підбір метрично схожого запасного шрифту прибирає зсув.
Чи прискорює сайт більше JavaScript-фреймворків?
Ні. Кожен кілобайт JavaScript треба завантажити, розібрати й виконати на процесорі телефона. Найшвидша сторінка — та, де більшість вмісту прийшла в HTML.
Що таке «примусове перекомпонування»?
Скрипт змінює DOM або стилі, а потім одразу читає геометрію (offsetWidth, getBoundingClientRect), змушуючи браузер негайно перерахувати компонування замість зробити це один раз наприкінці кадру. Часто це роблять сторонні рекламні скрипти.
Браузер — це конвеєр: мережа, розбір, стилі, компонування, малювання. Швидкий сайт — той, що не змушує конвеєр зупинятися й чекати.
Коротко: сторінка проходить шлях від DNS і HTTP через розбір HTML і CSS до компонування й малювання. CSS блокує відображення, синхронні скрипти блокують розбір, а зміна розмірів елементів під час завантаження спричиняє зсуви. Скорочуйте критичний шлях, резервуйте місце для зображень і реклами, відкладайте скрипти й вимірюйте на реальних пристроях.