Управляй порядком выполнения скриптов через defer и async, а затем направляй сеть с помощью preload, preconnect и prefetch.
Открыть этот урок в KodokonОбычный <script src> блокирует разбор HTML: браузер останавливается, скачивает, выполняет и только потом продолжает. Два атрибута меняют правила игры. defer скачивает параллельно разбору и выполняет скрипты в порядке документа, прямо перед DOMContentLoaded: это выбор по умолчанию для кода твоего приложения, который может зависеть от DOM и от других скриптов. async тоже скачивает параллельно, но выполняет сразу, как только файл придёт, без гарантии порядка: оставь его для самостоятельных скриптов вроде аналитики, которые ни от чего не зависят.
<script src="/js/analytics.js" async></script>
<script src="/js/vendor.js" defer></script>
<script src="/js/app.js" defer></script>Некоторые критичные ресурсы браузер обнаруживает совсем поздно: шрифт, указанный внутри CSS-файла, изображение, загружаемое из JavaScript. <link rel="preload"> решает эту проблему позднего обнаружения, объявляя ресурс прямо в <head>, с обязательным атрибутом as, чтобы браузер применил правильный приоритет и правильный кеш. Хрестоматийный случай - веб-шрифты, которые иначе запрашиваются только после того, как CSS скачан и разобран.
<link rel="preload" as="font" type="font/woff2"
href="/fonts/inter-var.woff2" crossorigin>
<link rel="preload" as="image"
href="/img/hero-1600.jpg" fetchpriority="high">Последнее семейство - низкоприоритетные сетевые подсказки. <link rel="preconnect"> заранее устанавливает полное соединение (DNS, TCP, TLS) со сторонним источником, который ты точно будешь использовать: до 300 мс экономии на первом запросе. dns-prefetch - его облегчённый родственник (только разрешение DNS), полезен как запасной вариант для менее очевидных источников. А prefetch скачивает в моменты простоя ресурс, предназначенный для следующего перехода: например, страницу оформления заказа из корзины. Компромисс очевиден: preload служит текущей странице, prefetch ставит на следующую.
<link rel="preconnect"
href="https://api.example.com">
<link rel="dns-prefetch"
href="https://cdn.example.com">
<link rel="prefetch" href="/checkout.html">