DEV Community

Андрей Викулов (VProger)
Андрей Викулов (VProger)

Posted on • Originally published at viku-lov.ru on

Как корректно выводить город доставки на карточке товара без ошибок кеша

Как корректно выводить город доставки на карточке товара без ошибок кеша

Как корректно выводить город доставки на карточке товара без ошибок кеша

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

Проблема не в самом тексте «Доставка Москва» или «Доставка Казань». Проблема в том, где именно этот текст формируется и на каком этапе попадает в итоговый HTML.

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

В чём суть ошибки

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

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

  • определённый город;
  • регион;
  • индивидуальную цену;
  • остаток по конкретному складу;
  • любой другой параметр, зависящий от текущего посетителя.

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

Почему это особенно заметно на блоке доставки

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

Поэтому здесь нужен не просто «рабочий вывод», а правильное разделение ответственности:

  • кешируемая часть должна содержать только общую разметку;
  • персональные данные должны подставляться отдельно.

Какой подход считается безопасным

Надёжный вариант состоит из двух шагов:

  1. Внутри кешируемого шаблона оставить плейсхолдер или нейтральный контейнер.
  2. Подставлять город уже после формирования кешируемой части, на этапе финального вывода.

Смысл этого подхода простой: общий HTML можно кешировать, а пользовательский фрагмент должен жить отдельно.

Почему не стоит вставлять город прямо в шаблон карточки

Когда город определяется до сохранения HTML в кеш, возникают такие риски:

  • пользователи видят чужой город;
  • сложно воспроизвести ошибку, потому что она зависит от очередности запросов;
  • очистка кеша временно помогает, но не лечит архитектуру;
  • отладка становится запутанной, потому что смешиваются кеш, cookie и GeoIP.

Если проблема уже проявилась хотя бы один раз, значит вывод организован не в том месте.

Что именно должно быть в кешируемой части

В кешируемой разметке лучше оставлять только то, что одинаково для всех:

  • иконку доставки;
  • подпись блока;
  • общую структуру;
  • статический текст вроде «Самовывоз сегодня»;
  • контейнер под город.

Пример идеи:

Read more on Viku-Lov Studio

Top comments (0)