Ленивый перфоманс: Core Web Vitals за бесплатно

Многие разработчики в потоковой веб-разработке или веб-студиях живут в парадигме «работает — сдаём». В итоге сайты весят мегабайты, а клиент на мобилке ждет загрузки по 10 секунд.

Рассмотрим 5 простых приемов, которые дадут ощутимый прирост производительности вообще без напряга. Для кого-то это база, но мой опыт показывает: даже крепкие мидлы регулярно забывают про эти вещи, просто пытаясь успеть закрыть таску.

1. Ленивые картинки (но с умом) На все изображения <img>, которые находятся вне первого экрана, смело вешаем атрибут loading="lazy". Загрузка графики «съедает» ресурсы сети и процессора. Зачем качать то, что пользователь может никогда не увидеть? Браузер сам подгрузит их при скролле. • Важный нюанс: Никогда не ставьте loading="lazy" на картинки первого экрана (главный баннер, логотип). Это задержит их появление и намертво испортит метрику LCP (Скорость загрузки основного контента). • Про размер: Не ленитесь проверять разрешение статичных картинок и пережимать их в современные форматы (WebP / AVIF).

2. Чистка мертвого CSS Браузер не начнет рендерить страницу, пока полностью не распарсит CSS. Чем больше файл, тем дольше пользователь смотрит на белый экран. Откуда берется лишний код?

• Хвосты истории: На долгоживущих проектах стили часто собираются в один монолит. Промо-страницу удалили, а её стили остались в кодовой базе навечно. Удалили компонент? Убедитесь, что стерли его стили. • Слепой импорт: Подключили библиотеку ради одной кнопки, а импортнули весь её глобальный CSS-пакет. Думайте, что тащите в бандл. • Сломанные миксины: Реальный кейс из практики — криво настроенный препроцессор дублировал тяжелые миксины внутри каждого изолированного компонента. Вместо глобальных утилитарных классов  получили тысячи их копий в коде страницы.

3. Отказ от transition: all Никогда не пишите transition: all 0.3s. Указывайте конкретное свойство, которое анимируете (например: transition: opacity 0.3s, transform и т.д.). При all браузер вынужден следить за каждым изменением элемента. Это может приводить к постоянным скрытым расчетам геометрии страницы (Reflow/Repaint), из-за чего интерфейс начинает микро-лагать при скролле или кликах.

4. Динамические компоненты во Vue/Nuxt Частая история: на странице есть тяжелая модалка, попап или виджет, который открывается только по клику. Мы скрываем его через привычный "v-if". Но вот ловушка: код этого компонента (JS и CSS) всё равно намертво вшивается в основной бандл. Браузер тратит время на его скачивание и парсинг, хотя пользователь может вообще никогда не кликнуть на эту кнопку. • В Nuxt: Проблема решается элементарно. Достаточно добавить приставку Lazy к названию компонента (например: <LazyMyModal v-if="..." />). • В чистом Vue: Оборачиваем компонент в defineAsyncComponent(). Сборщик сам отрежет этот код в отдельный чанк и скачает его только в момент клика. Бандл худеет на глазах.

5. Контроль размера DOM (глубина дерева) Браузер строит дерево элементов (DOM) и тратит ресурсы на его обход. Если ваша страница — это бесконечный лендинг «все обо всем», где вложенность дивов достигает Китая, интерфейс начнет тормозить даже на мощных устройствах. Да, структура страницы часто зависит от дизайна и требований бизнеса. Но если вы видите откровенно перегруженную страницу, предложите менеджеру или заказчику разделить её на смысловые разделы или использовать пагинацию/ленивую подгрузку блоков.