Як вебсторінка стає видимою в браузері

Між натисканням Enter в адресному рядку й появою сторінки на екрані минає менше секунди, але за цей час браузер виконує довгий ланцюжок операцій: знаходить сервер, завантажує HTML, розбирає…

Ілюстрація до статті: Як вебсторінка стає видимою в браузері

Оновлено:

Між натисканням Enter в адресному рядку й появою сторінки на екрані минає менше секунди, але за цей час браузер виконує довгий ланцюжок операцій: знаходить сервер, завантажує HTML, розбирає його, підтягує стилі й скрипти, обчислює, де стоятиме кожен елемент, і малює пікселі. Розуміння цього конвеєра пояснює, чому одні сайти «стрибають» під час завантаження, чому текст іноді з’являється раніше картинок, і що насправді вимірюють показники на кшталт LCP чи CLS у звітах про швидкість.

Від HTML до пікселів: як браузер малює сторінку

  1. Мережа. Браузер перетворює ім’я домену на IP-адресу через DNS, встановлює TCP-з’єднання і TLS-сеанс, надсилає HTTP-запит і починає отримувати HTML. Кожен із цих кроків — окремий «обхід» до сервера, і на мобільній мережі вони разом можуть зайняти сотні мілісекунд ще до отримання першого байта.
  2. Розбір HTML → DOM. Отриманий текст перетворюється на дерево об’єктів — Document Object Model. Розбір відбувається потоково, у міру надходження даних. Натрапивши на <link rel="stylesheet"> або <script>, браузер запускає їхнє завантаження.
  3. Розбір CSS → CSSOM. Стилі також перетворюються на дерево правил. Тут ключова особливість: браузер не малює нічого, поки не отримав і не розібрав увесь CSS, підключений у <head>, бо інакше сторінка на мить з’явилася б без стилів. Тому CSS називають ресурсом, що блокує відображення.
  4. JavaScript. Звичайний <script> зупиняє розбір HTML, поки скрипт не завантажиться й не виконається, бо він може змінити документ. Атрибути defer і async знімають це блокування.
  5. Дерево відображення й компонування (layout). DOM і CSSOM поєднуються: для кожного видимого елемента обчислюються розмір і позиція. Зміна розміру одного блоку може зсунути всі наступні — це і є «перекомпонування» (reflow), одна з найдорожчих операцій.
  6. Малювання й композиція. Елементи перетворюються на пікселі шарами, які потім поєднуються — часто на 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 блокує відображення, синхронні скрипти блокують розбір, а зміна розмірів елементів під час завантаження спричиняє зсуви. Скорочуйте критичний шлях, резервуйте місце для зображень і реклами, відкладайте скрипти й вимірюйте на реальних пристроях.