Preconnect — атрибут тега <link rel="preconnect" href="...">, который говорит браузеру: «в скором времени понадобится этот домен — начинай DNS-запрос, TLS-рукопожатие и TCP-соединение прямо сейчас». К моменту реальной загрузки ресурс уже идёт по готовому каналу.
Полезен для шрифтов от Google Fonts, аналитики, CDN с изображениями. Каждый preconnect — отдельное соединение, злоупотреблять не стоит: 3–4 ключевых домена достаточно.
<!-- TCP+TLS handshake к домену заранее --> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="preconnect" href="https://mc.yandex.ru">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> — экономит ~100 мс при первой загрузке шрифта.
Ключевая тонкость: для шрифтов и любых cross-origin ресурсов с CORS preconnect почти бесполезен без атрибута crossorigin. Браузер открывает два разных соединения — анонимное и с учётными данными, — и если предсоединение было анонимным, а шрифт качается с CORS, прогретый канал просто не используется. Поэтому строка для fonts.gstatic.com всегда идёт с crossorigin, а для домена картинок без CORS — без него. Ошибку видно в DevTools → Network по колонке Connection ID: если у шрифта новый ID, preconnect не сработал.
Не путайте preconnect с preload: первый готовит соединение (DNS + TCP + TLS), но не качает файл, второй скачивает конкретный ресурс с высоким приоритетом. Их часто комбинируют для критичного шрифта. Злоупотребление вредит: каждое лишнее предсоединение держит сокет и конкурирует за пропускную способность, поэтому ограничьтесь 3–4 доменами, которые реально нужны в первые секунды (шрифты, CDN картинок первого экрана, аналитика). Эффект заметнее на мобильном 4G, где TLS-рукопожатие к новому хосту стоит 100–300 мс.
Браузер заранее проходит DNS, TCP и TLS до домена, но файл ещё не качает.
Для шрифтов и CORS-ресурсов без этого атрибута прогретое соединение не переиспользуется.
Каждый preconnect держит сокет, поэтому только хосты, нужные в первые секунды загрузки.
Интернет-магазин на 4G: до preconnect шрифт с fonts.gstatic.com стартовал на 480 мс (DNS 60 + TCP 90 + TLS 140 + ожидание). После добавления рукопожатие идёт параллельно с парсингом HTML, и текст рисуется на ~180 мс раньше — заметный сдвиг по FCP в Метрике.