«Выполнить JS один раз» — скрипты без побочных эффектов на SPA
На страницах типа одностраничного приложения (SPA) JustZix повторно запускает JavaScript набора правил после каждой смены адреса — чтобы правило обработало свежеотрендеренный вид. Для большинства скриптов это хорошо. Но для скриптов с глобальными побочными эффектами это приводит к накоплению. Новая опция «Выполнить JS один раз» решает эту проблему.
Проблема: скрипт запускается снова и снова
SPA меняет содержимое без перезагрузки документа. JustZix обнаруживает такую навигацию и запускает JS набора правил заново, чтобы правило сработало на новом виде. Но если скрипт добавляет слушатель событий, устанавливает интервал (setInterval) или «оборачивает» функцию страницы (например, window.fetch или dataLayer.push), каждый повторный запуск добавляет ещё одну копию. После нескольких переходов у вас пять одинаковых слушателей, пять параллельных интервалов и функция, обёрнутая пять раз.
Решение: флажок «Выполнить JS один раз»
На вкладке JavaScript редактора набора правил теперь есть поле «Выполнить JS один раз» (по умолчанию выключено — для существующих наборов правил ничего не меняется). Отмечено — JS набора правил выполняется один раз за время жизни документа. SPA-навигация, смена #hash и кнопка «Назад» больше не запускают его повторно. Полная перезагрузка страницы всегда даёт свежий старт.
Когда отмечать
Включите «Выполнить JS один раз» для скриптов, которые:
- добавляют глобальные слушатели (
addEventListenerнаdocumentилиwindow), - устанавливают интервалы или таймауты,
- изменяют объект
windowили оборачивают встроенные функции, - настраивают наблюдатель (
MutationObserver), который сам и так поймает последующие виды.
Когда оставить выключенным
Оставьте опцию выключенной для скриптов, которые должны реагировать на каждый под-вид SPA — например, для тех, что каждый раз находят свежеотрендеренные элементы и что-то с ними делают. Если ваш скрипт идемпотентен (безопасен при многократном запуске), менять тоже ничего не нужно.
Хорошая практика: идемпотентный код
Независимо от этой опции, стоит писать скрипты, устойчивые к повторному запуску. Простой шаблон — страж, который прерывает скрипт, если он уже выполнялся:
// Страж: выполнить логику только один раз на документ
if (!window.__jzMyScript) {
window.__jzMyScript = true;
document.addEventListener('keydown', onKey);
}
Опция «Выполнить JS один раз» и страж в коде — это два слоя одной и той же защиты, и можно использовать оба сразу.
Установите JustZix и пишите скрипты, которые работают на SPA без накопления побочных эффектов.
Оцени эту статью
Оценок пока нет — оцени первым.