Производительность
Производительность — это не только цифры, но и субъективное ощущение пользователя. Интерфейс должен быть быстрым, предсказуемым и визуально стабильным. Оптимизация проектируется на этапе разработки, а не добавляется постфактум.
Цели frontend-оптимизации
| Цель | Описание |
|---|---|
| Быстрая загрузка | Первый значимый контент появляется без ощущения ожидания |
| Плавность | Интерфейс не тормозит, не дёргается, не зависает при взаимодействии |
| Стабильность | Контент не прыгает и не сдвигается во время загрузки |
| Предсказуемость | Пользователь в любой момент понимает состояние интерфейса |
Общие принципы
MUST
- Порог визуального отклика — 100ms — любое действие пользователя подтверждается мгновенно.
- Индикация ожидания — для всех операций длиннее 100ms обязателен промежуточный статус (spinner, skeleton).
- Прогрессивная загрузка — контент отрисовывается в порядке приоритета: Layout → LCP → второстепенные модули.
- Плавность — 60 FPS — все анимации и интерактивные переходы выполняются с частотой 60 FPS (~16.6ms на кадр).
- Long Tasks < 50ms — длительность одной задачи в main thread не превышает 50ms. Превышение увеличивает Input Delay и ухудшает INP.
- Запрет Request Waterfalls — последовательные сетевые запросы там, где возможен параллельный вызов (
Promise.allSettled), запрещены. Исключение: запросы с зависимостью по данным.
SHOULD
- Optimistic UI — для предсказуемых действий (лайки, избранное) состояние обновляется до ответа сервера. Обязателен rollback при ошибке.
- Тяжёлые операции выносить из main thread через yielding / task splitting или Web Workers (например: сортировка/фильтрация > 5000 объектов, обработка Canvas).
FORBIDDEN
- Оставлять действие пользователя без визуального отклика.
- Блокировать интерфейс без явного состояния загрузки.
- Выполнять тяжёлые операции синхронно в основном потоке.
- Последовательные сетевые запросы там, где возможен параллельный вызов.