Учебник Производительность веба для начинающих
Как сделать сайт быстрым и доказать это цифрами: метрики Core Web Vitals, критический путь, бандл, картинки и кеш.
Курс «Производительность веба: Core Web Vitals» состоит из 5 разделов и 15 уроков: Метрики, Критический путь рендеринга, Ресурсы, JavaScript и бандл и Сеть и доставка. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.
Программа курса
1 Метрики
- Core Web Vitals: LCP, INP, CLS
Что означают LCP, INP и CLS, какие у них целевые значения, из каких фаз они складываются и как снять их прямо в браузере через PerformanceObserver.
- Лабораторные и полевые данные
Lighthouse против реальных пользователей: почему 100 баллов ничего не гарантируют, что такое CrUX и RUM и зачем метрики считают по 75-му перцентилю.
- Инструменты измерения
Lighthouse, DevTools Performance и Network, WebPageTest: как настроить троттлинг сети и CPU и как читать водопад загрузки, чтобы найти причину медленного LCP.
- Core Web Vitals: LCP, INP, CLS
2 Критический путь рендеринга
- Что происходит от запроса до первого пикселя
Критический путь рендеринга по шагам: DOM, CSSOM, дерево рендеринга, layout и paint. Почему CSS блокирует отрисовку, а синхронный script — парсинг. Разбор defer, async и type=module.
- Блокирующие ресурсы и как их убрать
Критический CSS инлайном, асинхронная загрузка остальных стилей, шрифты без FOIT: font-display swap и preload, и что делать со сторонними скриптами — главным тормозом страницы.
- CLS: почему страница «прыгает»
Cumulative Layout Shift: как считается метрика, откуда берутся прыжки вёрстки — картинки без размеров, шрифты, баннеры и реклама — и как резервировать место через width/height и aspect-ratio.
- Что происходит от запроса до первого пикселя
3 Ресурсы
- Изображения: главный вес страницы
Форматы WebP и AVIF, адаптивные srcset и sizes, loading=lazy и почему его нельзя вешать на LCP-картинку, сжатие и резерв места под изображение.
- Шрифты
woff2, подмножества и unicode-range, preload с crossorigin, font-display и борьба с FOIT/FOUT, метрики фолбэка и системный стек как рабочий вариант.
- Сторонние скрипты и виджеты
Как аналитика, чаты и реклама убивают INP: long tasks, async и defer, загрузка по взаимодействию, facade вместо ютуб-плеера, бюджет на чужой код.
- Изображения: главный вес страницы
4 JavaScript и бандл
- Размер бандла и анализ
Почему 2 МБ JavaScript — приговор на мобильном. Анализ бандла через bundle analyzer, поиск тяжёлых зависимостей, замена moment на dayjs, tree shaking и бюджеты размера.
- Code splitting и ленивая загрузка
Code splitting на практике: разделение бандла по маршрутам и компонентам, динамический import(), prefetch и правила «что грузить сразу, а что по требованию».
- INP: отзывчивость интерфейса
INP и долгие задачи: почему интерфейс не отвечает на клики, как разбивать работу, отдавать управление главному потоку, использовать Web Worker и виртуализировать длинные списки.
- Размер бандла и анализ
5 Сеть и доставка
- Кеширование в браузере
Cache-Control, ETag, immutable и хеш в имени файла: как настроить кеш так, чтобы повторный визит грузился мгновенно, а деплой не залипал у пользователей.
- CDN и сжатие
CDN, gzip против brotli, что реально меняют HTTP/2 и HTTP/3, и как правильно использовать preconnect и dns-prefetch, не навредив.
- Бюджет производительности и регрессии
Performance budget, Lighthouse CI в пайплайне и алерты на деградацию поля: как зафиксировать достигнутую скорость и не дать ей откатиться через два спринта.
- Кеширование в браузере