„Wykonaj JS tylko raz” — skrypty bez efektów ubocznych na SPA
Na stronach typu aplikacja jednostronicowa (SPA) JustZix ponownie uruchamia JavaScript zestawu po każdej zmianie adresu — żeby obrobić świeżo wyrenderowany widok. Dla większości skryptów to dobrze. Ale dla skryptów z efektami globalnymi prowadzi to do kumulacji. Nowa opcja „Wykonaj JS tylko raz” rozwiązuje ten problem.
Problem: skrypt uruchamiany w kółko
SPA zmienia treść bez przeładowania dokumentu. JustZix wykrywa taką nawigację i odpala JS zestawu od nowa, żeby reguła zadziałała na nowym widoku. Jeśli jednak skrypt dodaje listener zdarzeń, zakłada interwał (setInterval) albo „opakowuje” funkcję strony (na przykład window.fetch czy dataLayer.push), każde re-uruchomienie dokłada kolejną kopię. Po kilku przejściach masz pięć identycznych listenerów, pięć równoległych interwałów i pięciokrotnie zawiniętą funkcję.
Rozwiązanie: checkbox „Wykonaj JS tylko raz”
W zakładce JavaScript edytora zestawu jest teraz pole „Wykonaj JS tylko raz” (domyślnie wyłączone — nic się nie zmienia w istniejących zestawach). Zaznaczone — JS zestawu wykona się jeden raz na żywot dokumentu. Nawigacja SPA, zmiana #hash i przycisk Wstecz już go nie uruchomią ponownie. Pełne przeładowanie strony zawsze daje świeży start.
Kiedy zaznaczyć
Włącz „Wykonaj JS tylko raz” dla skryptów, które:
- dodają globalne listenery (
addEventListenernadocumentlubwindow), - zakładają interwały lub timeouty,
- modyfikują obiekt
windowalbo opakowują wbudowane funkcje, - ustawiają obserwator (
MutationObserver), który i tak sam złapie kolejne widoki.
Kiedy zostawić wyłączone
Zostaw opcję wyłączoną dla skryptów, które mają reagować na każdy podwidok SPA — na przykład takich, które za każdym razem szukają świeżo wyrenderowanych elementów i coś z nimi robią. Jeśli Twój skrypt jest idempotentny (bezpieczny przy wielokrotnym uruchomieniu), również nie musisz nic zmieniać.
Dobra praktyka: idempotentny kod
Niezależnie od tej opcji warto pisać skrypty odporne na ponowne uruchomienie. Prosty wzorzec to strażnik, który przerywa skrypt, jeśli już raz się wykonał:
// Strażnik: wykonaj logikę tylko raz na dokument
if (!window.__jzMojSkrypt) {
window.__jzMojSkrypt = true;
document.addEventListener('keydown', onKey);
}
Opcja „Wykonaj JS tylko raz” i strażnik w kodzie to dwie warstwy tej samej ochrony — możesz korzystać z obu naraz.
Zainstaluj JustZix i pisz skrypty, które działają na SPA bez kumulacji efektów ubocznych.
Oceń ten wpis
Brak ocen — oceń jako pierwszy.