Оптимізація шрифтів сайту (font-display, preload, subset)

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Оптимізація шрифтів сайту (font-display, preload, subset)
Середня
~1 робочий день
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Оптимізація шрифтів: font-display, preload, subset

Кастомні шрифти — розповсюджена причина повільного FCP та CLS. Браузер повинен завантажити шрифт до відображення тексту (або показати невидимий текст / системний шрифт). Правильна налаштування усуває обидва симптоми.

font-display — управління рендерингом

@font-face {
    font-family: 'Inter';
    src: url('/fonts/inter-regular.woff2') format('woff2');
    font-weight: 400;
    font-style: normal;
    font-display: swap; /* показати fallback миттєво */
}
Значення Поведінка Коли використовувати
auto Залежить від браузера Не використовуйте
block Сховати текст до завантаження (FOIT) Іконочні шрифти
swap Fallback → основний при завантаженні Основний текст
fallback 100мс сховано, потім swap Баланс FCP/CLS
optional Тільки якщо вже закеширований Некритичні шрифти

Для основного тексту — swap. Для декоративних заголовків де FOUT допустим — swap. Для іконочних шрифтів — block (інакше іконки відобразяться як символи).

Preload критичного шрифту

<head>
    <!-- Preload до завантаження CSS -->
    <link rel="preload"
          href="/fonts/inter-regular.woff2"
          as="font"
          type="font/woff2"
          crossorigin>

    <!-- Якщо кілька граничних — preload тільки використовувані above-the-fold -->
    <link rel="preload" href="/fonts/inter-700.woff2" as="font" type="font/woff2" crossorigin>
</head>

Preload тільки шрифти першого екрана. Preload усіх граничних уповільнює завантаження.

Subset — тільки потрібні символи

Повний Inter містить латиницю, кириллицю, грецький, іврит — ~500 кБ. Підмножина тільки з потрібними символами — 30–80 кБ.

/* unicode-range для кириллиці */
@font-face {
    font-family: 'Inter';
    src: url('/fonts/inter-cyrillic.woff2') format('woff2');
    font-weight: 400;
    font-display: swap;
    unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}

/* Латиниця — окремий файл */
@font-face {
    font-family: 'Inter';
    src: url('/fonts/inter-latin.woff2') format('woff2');
    font-weight: 400;
    font-display: swap;
    unicode-range: U+0000-00FF, U+0131, U+0152-0153;
}

Браузер завантажує тільки файли з символами, що зустрічаються на сторінці.

Генерація subset через pyftsubset

# Установка
pip install fonttools brotli

# Створення subset із кириллицею + базовою латиницею
pyftsubset inter-regular.ttf \
    --unicodes="U+0020-007E,U+00A0-00FF,U+0400-045F,U+0490-0491" \
    --layout-features="kern,liga,calt" \
    --flavor=woff2 \
    --output-file=inter-regular-subset.woff2

Self-hosted vs Google Fonts

Google Fonts вводить DNS lookup + connection overhead для кожного нового користувача. Self-hosted шрифти:

  • Видаляють cross-origin затримку
  • Дозволяють використовувати HTTP/2 push або preload
  • Працюють без залежності від сторонньої CDN
# Скачайте шрифт з правильним subset
# Використовуючи google-webfonts-helper (gwfh.mranftl.com)
# або fontsource npm пакет
npm install @fontsource-variable/inter
/* Fontsource — автоматично включає потрібні файли */
@import '@fontsource-variable/inter/cyrillic.css';
@import '@fontsource-variable/inter/latin.css';

Компенсація CLS від font-swap

/* Підберіть метрики для fallback шрифту */
@font-face {
    font-family: 'InterFallback';
    src: local('Arial');
    ascent-override:  90%;
    descent-override: 22%;
    line-gap-override: 0%;
    size-adjust: 107%;
}

body {
    font-family: 'Inter', 'InterFallback', sans-serif;
}

Інструменти для підбору значень: fontaine npm-пакет або next/font (автоматично для Next.js).

Variable fonts

Один файл замість окремих для кожного граничного:

@font-face {
    font-family: 'Inter';
    src: url('/fonts/inter-variable.woff2') format('woff2-variations');
    font-weight: 100 900; /* діапазон */
    font-display: swap;
}

/* Використання */
h1 { font-weight: 700; }
body { font-weight: 400; }
.light { font-weight: 300; }

Variable font Inter (~170 кБ subset кириллиця+латиниця) vs. окремі файли для 400 + 700 (~120 кБ). Вигідно при ≥ 3 граничних.

Час оптимізації: 4–8 годин: скачайте шрифти, зробіть subset, налаштуйте preload та CSS.