Подключение
Три вещи, которые стоит сделать правильно с первого раза: preconnect, версионирование и заголовки кеширования.
Preconnect
Браузер не начнёт качать файл, пока не установит соединение: DNS, TCP, TLS. На мобильной сети это легко превращается в лишние 300–400 мс. Подсказка в <head> запускает установку соединения заранее, параллельно с разбором HTML.
<link rel="preconnect" href="https://cdn.99p.ru" crossorigin>
Атрибут crossorigin обязателен, если с домена грузятся шрифты — без него браузер откроет второе соединение, и смысл подсказки пропадёт.
Версионирование
Версия кладётся в имя файла, а не в query-строку:
/assets/app.4f2c9a1.js — так
/assets/app.js?v=4f2c9a1 — не так
Часть промежуточных кешей игнорирует query-строку при выборе ключа, и пользователь получает старый файл под новым адресом. Хеш в имени снимает вопрос целиком.
Заголовки
| Тип | Cache-Control |
|---|---|
| С хешем в имени | public, max-age=31536000, immutable |
| Без хеша | public, max-age=2592000 |
| Часто меняется | public, max-age=300, stale-while-revalidate=86400 |
Сжатие включено на стороне узла: zstd, затем gzip. Предварительно сжимать файлы при сборке не нужно.
Проверка
curl -sI https://cdn.99p.ru/assets/style.css | grep -i "cache-control\|content-encoding"