Что не нужно префетчить/пререндерить?
Tags: webdev, javascript
Published: 2020-05-19 16:23:48

Вольный перевод статьи [What (not) to Prefetch/Prerender](https://addyosmani.com/blog/what-not-to-prefetch-prerender/)

В этом посте описан ряд крайних случаев, с которыми мы столкнулись при разработке библиотек <link rel = prefetch>, таких как [Quicklink](https://getquick.link/). Мы считаем, что большинство этих крайних случаев в равной степени применимы к случаям, использующим <link rel = prerender> или «prefetching» из скрипта. В итоге:

- Избегайте предварительной загрузки страниц для аутентификации
- Избегайте предварительной загрузки во избежании DoS
- Избегайте предварительной загрузки ссылок на ключевые страницы покупки
- Избегайте предварительной загрузки больших ресурсов
- Избегайте предварительной загрузки ссылок других источников
- Избегайте предварительной загрузки рекламы

Мы бы порекомендовали любые инструменты, которые пытаются предварительно загрузить ресурсы, при этом поддерживающие описанные крайние случаи. Они довольно распространены в дикой природе и могут, как минимум, сделать пользовательский опыт менее приятным или, в худшем случае, сломать его.

# Избегайте предварительной загрузки страниц для аутентификации

Конфигурация, учитывающая эти классы страниц, позволит избежать случайных выходов из системы или истечения сеанса. Даже в одном и том же домене пользователи могут запутаться при входе в систему, переходе от a->b и внезапно быть выброшены из-за того, что logout был предварительно загружен.

Решением этой проблемы является обнаружение и игнорирование страниц, участвующих в процессе аутентификации. 
В особенности:
- Определить страницы входа (/ login, login.js, login.php и т.д.)
- Определить страницы выхода
- Определить страницы сброса пароля
- Определить страницы регистрации

# Избегайте предварительной загрузки во избежании DoS

### Где сервер может ограничить доступ из-за злоупотребления

Избегайте слишком частой предварительной загрузки с одного и того же сервера в течение N-ого периода времени (например, N = 10 минут). В наши дни на серверах часто применяется защита от DOS, чтобы избежать злоупотреблений одним IP-адресом, выполняющим слишком много запросов. Методом проб и ошибок почти регулярного запроса только из одного источника может помочь избежать этих проблем.

### Где сервер может не иметь возможности обрабатывать так много запросов

Избегайте создания большого количества запросов к одному и тому же серверу при каждой навигации. Трудно определить, насколько хорошо сайты могут обрабатывать дополнительный трафик, получаемый при предварительной загрузке. Крупные сайты, вероятно, лучше способны благодаря своей инфраструктуре.

# Избегайте предварительной загрузки ссылок на ключевые страницы покупки

- Корзины в e-commerce (например, cart, cart.php и т.д.). Это может исказить их впечатления от сервера о том, как часто пользователи на самом деле пытаются увидеть, что находится в их корзине, а когда нет. Можно утверждать, что это очень крайний случай, но в любом случае.
- Предварительная загрузка ссылок «добавить в корзину» может привести к добавлению товаров в корзину без согласия пользователя. Эти функции иногда реализуются с помощью тегов <input> или <button>, но также могут быть реализованы с помощью ссылок.

# Избегайте предварительной загрузки ссылок на ресурсы, которые, как правило, имеют большой размер

например, mp4, gif, zip, pdf. Загрузка файлов без согласия пользователя недопустима в большинстве случаев. Это может быть особенно вредно на сайтах, которые перечисляют несколько файлов для загрузки (например, видео или музыкальные плейлисты).

# Избегайте предварительной загрузки ссылок других источников

Кеширование с двойным ключом сильно повлияет на вашу способность делать это, но в целом старайтесь избегать этого, поскольку это может привести к утечке истории посещений пользователя третьим лицам.

# Избегайте предварительной загрузки рекламы

- Предварительная загрузка рекламных ссылок может привести к тому, что она будет считаться рекламным кликом на рекламных серверах, что приведет к завышенным показателям, таким как CTR.
- Реклама обычно показывается внутри фреймов, которые могут игнорироваться автоматическими инструментами предварительной загрузки, но иногда они вставляются в документ верхнего уровня непосредственно автором сайта.

## Избегайте предварительной загрузки ссылок по протоколам, отличным от http / https:

например tel:, mailto:, javascript:, market:, intent:. В зависимости от браузера предварительная загрузка этих ссылок может инициировать действия браузера в ответ на них.