Всплывающая форма открывалась с заметной задержкой. Логичный ход — проверить кэш: может, форма не прогрета? Замер показал странное: из кэша и без кэша форма отвечала одинаково, около 180 миллисекунд.
Это восемнадцатая, заключительная часть цикла «Кэш фрагментов и Redis».
Где на самом деле время
Рендер формы — несколько миллисекунд. Почти все 180 мс — это вход в WordPress: загрузка ядра, плагинов, темы, ещё до того, как код дойдёт до кэша. Кэш блоков экономит рендер, а вход в WordPress он не экономит. Поэтому прогрев здесь задержку не лечит — лечит фронт.
Вывод для всей системы: кэш блоков делает тяжёлый блок быстрым, но лёгкий блок быстрее 150–200 мс он не сделает. Дальше выигрыш только на клиенте.
Что сделали на фронте
| Было | Стало |
|---|---|
| скрипты попапа и формы грузятся по очереди | параллельно, через Promise.all |
| запрос формы — после анимации открытия (410 мс) | запрос стартует вместе с анимацией |
| лишняя пауза 200 мс перед показом | убрана |
| каждое открытие — новый запрос | промис формы запоминается до конца жизни вкладки |
| запрос по клику | запрос по намерению — при наведении или касании |
const forms = new Map();
function loadForm(id) {
if (!forms.has(id)) {
forms.set(id, fetchForm(id)); // один запрос на вкладку
}
return forms.get(id);
}
document.querySelectorAll('[data-popup-form]').forEach((btn) => {
const id = btn.dataset.popupForm;
btn.addEventListener('pointerenter', () => loadForm(id), { once: true });
btn.addEventListener('touchstart', () => loadForm(id), { once: true, passive: true });
});
Наведение или касание опережает клик на 300–800 мс — этого хватает, чтобы форма успела прийти до того, как её попросят показать.
Чего не делать
Не загружайте формы всем посетителям после загрузки страницы «на всякий случай». Это запрос к WordPress на каждый просмотр — тысячи ненужных входов в PHP ради тех немногих, кто откроет форму. Загрузка по намерению даёт ту же скорость без этой цены.
Чем заканчивается цикл
Мы прошли путь от «почему ajax-блокам нужен свой кэш» до Redis, сторожей и форм. Последняя часть — напоминание о границе: кэш убирает рендер, но не убирает вход в PHP. Где кончается выигрыш на сервере, начинается работа на клиенте.
Про кэш самих страниц — цикл «Кэш страниц без MISS», про скорость в браузере — «PageSpeed без мифов».
Всплывающие формы открываются с задержкой?
Пришлите адрес — найду, где теряются миллисекунды, на сервере или в браузере.
// загружаю комментарии…