Галоўная / Артыкулы

Проектаванне для кэшу прыгуна назад/вперед: абяцейкі, відновленне і стан.

Выявіце, як кэш прыгуна назад/вперед відновляе цэлыя сторункі, што тыхо яго блакуе, і як кераваць відновленым станом за дапамою pageshow і pagehide.

Выдавец: REACTAPP.TOP14 хв чытання3106 слоў

Крыніцы: The Browser Feature Most Frontend Developers Completely Ignore

Калі корыстнік нажымае кнопку «Адзин», большасць прыкладоў праграмнае апаратуры таямніча перадзваняе роботу, якую прыгледзіць мог ўражыннік: зноў запрашае HTML, выкананяе кожнага скрыпту, паўторная будова DOM і перзаваначванне дадзэнняў. Кеш для навігацыі адзін/наступны (bfcache) створаны самэ для таго, каб ужо не было такога, але ў павсякдзенным кодзе яго часта выключаюць без таго, каб хтось гэта зазначыў, або неправяма обрабоцуюць сторанку, якую ён вяртае. У гэтым кансалтаты раз’яснюецца, чаму bfcache адрозніцца ад звычайнага кэшавання, якія прычыны яго блакуе, як выканаць адзначэнне і реакцію на вярнутую сторанку, а таксама як пераканацца ў ўзімку на сэрварах самога корыстніка.

Чаму навігацыя па історыі выклікае асаблівую увагу

Робота над аддачай працэйсу часта сфокусаваная на першым адвізе. Команды стискаюць зображэнні, дзеляць пакеты, падготавляюць шрыфты заздалегідь, скарматываюць мінімум ресурсоў, налаштовуюць вызывы API і стежаць за показам Largest Contentful Paint. Усё гэта цяжкае, але ў той жытак таямніча прыпускае, што кожны адвіз сторанкі пачынаецца з порожньяго вікна і свежа запісанага URL.

Людзі не пераглядаюць веб-сторонкі так. Пакупальнік ачывае адзін товар, вяртаецца да спісу рынку, ачывае іншы товар, зноў вяртаецца. Чытальнік пераходзіць па лінку з статыі і вяртаецца, каб дакончыць яе чытанне. Кто-небудзь зноў заходзіць у напалоўна заполнены форму. Кнапкі «Назад» і «Вперад» ўваходзяць у число найчащэй выкарыстоўваных элементаў у будзь-ям браузере, і такія дзеяння ўсё частае явышчэ, чым экзотычныя.

Браузеры оптымізуюць гэты процес за дапамогою bfcache. У змену тому, каб закінчыць працэс перадачы сторанкі, калі корыстувальнік адходзіць, браузер можа зберагчы копію всіго дакумента ў памяці. Калі корыстувальнік вяртаецца через історыю сесій, браузер можа праказаць гэтую копію, замест таго, каб паўтараць запиты да сеті, парсаванне HTML, выконанне скрыптов, завантажэнне дадзеных і ўражанне сторанкі. Кожны вядомы браузер реалізуе якуюсь версію гэтага механізма, хоча точныя правілы прызначэння і внутрашняе функціонаванне разлічаюцца между браузерамі.

З боку пользователя процес успешнага вярнення стану сайту здаецца майже мгновэнным. Офсет прасування залишаецца тым, кам ён быў, структура DOM застаецца недыранай, полья формы можаюць яшчэ зберагчы свяйзі, а кеш JavaScript працюе як раней. Але ёсць два прынципавых проблемы: багато команд ніколі не пераканальваюцца, чыя саме сторункі падходзяць для такога вярнення, а код, які прыпускае, што кожны візіт — это абсалютна новая сторунка, можа паспеліць да некароткага працавання, калі вяртаецца старая версія.

Таму bfcache — гэта не проста безкоштовная дапамога для падвышэння швальнасці. Ён адкрывае болей рэалістычны цикл жыцця сторункі: сторунка можа застацца «спячай» пры тым, што застаецца актываючайся, а пазней працаваць без неабяжнае выканання коду запуску.

Як bfcache адрозніцца ад HTTP-кашы

Спяльнае слова «cache» вызывае першую плутанню. Лёгка ўявіць, што bfcache значыць проста павторны выкарыстоўванне CSS, скраптов, адобразаў чы адпаведзей API, якія былі завантажаны раней. Гэта і є HTTP-каша, якая працуе на набліжнае болей дробным рэвэлю.

Кэш HTTP зберагае адзінаковыя адказы. Вернуцца на сторанку можа дазволіць браузеру прыхіліцца да дзеякіх завантажэнняў, але сам дакумент все рава трэба перзбудаваць: парсаваць HTML, выкананыя скрыпты, запускаць фрэймворк, ствараць DOM, паўтарна налажваць падпісы і адправляць новыя запиты.

bfcache зберагае цэлую сторанку, укладаючы ў сябе яе DOM і кашу JavaScript. Калі корыстнік пераходзіць далей, выкананне скрыптов можа быць признесенае; калі ён вяртаецца через історыю, браузер паказвае зберажаную сторанку і продовжывае яе роботу. Самэльга таму успех bfcache перавышае нават добра налаштаванае перзавантажэнне, якое значнаю часткаю падае з кэшу HTTP: проста застаёцца значна менш работы, якую трэба адрабатваць.

Это змінюе спосаб, яким трэба мыслець пра навігацыю. Пад вярненні данных з bfcache ваш стандартны пацек запуску не обавязкова запрацоўвае зноў. Зменная на рэвэлі модуля все ўсё можа застацца з свайго пачатковага значэння. DOM все ўсё адбівае тое, што выканаў корыстнік пры выходзе. Таймеры і іншая дзейнасць пад час выконання працуюць з таго месца, дзе ўсталі, а не ствараюцца з нуля.

Код, пабудаваны на пераконанні, што вярненне завжды означае повна перзагрузка, можа працягнуць неактуальны стан на экране, працягнуць апошнія змены або стварыць дублікаты, калі намагаецца налаштаваць тое, што вже існуе. Ментальная модель, яку трэба застосавіць, простая: браузер не перрэндарыў старую HTML адпаведь; ён працягнуў роботу павернутай у спячку сторанкі.

Вялікі успех, якому практычна не трэба новаг інтэрфейсу

Большая частка павышэнняя каркаснасці коштае чаго-небудзь відчутна: перадзялённыя компаненты, новыя статусы завантажэння, адрабатка на сервере чыста іншая стратэгія запрашоўкі дадзеных. bfcache ёсць нечыстае, таму што прыёмнік вже рэалізавае гэты механізм.

Ваша задача — не ствараць кэш. Яна заключаецца у тым, каб не перакрываць можлівасць прыёмніка выкорыстоўваць той кэш, які ёсць у яго, і каб жыцёвы цикл вашай сторанкі быў сумесны з ёё вярненням.

Гэта робіць яго аднай з найэфектывнейшых оптымізацый, якія є у распанаве багато команд. Сторанка, вярнутая з памяці, адмовляецца ад павтаральных перадач і большай часткі обробкі, якая трэба для звычайнага навігавання. Корыста ў большай меры спостарэчыцца на повольных прыстроях і сетях, але нават на швайных машынах ўсё ж відчуваецца явная разліка межа перзабудовай сторанкі і простым яе адкрыццем.

Ён таксама зберагае атмасферу працы з сайтом, а не толькі час експлуатацыі. Уявіце чалавека, які чытае дзёльгі статтю і адкрывае супакойныя лінкі, а пасля вяртаецца назад. Звычная перзагрузка вымушана перзаснаваць сторунку і пасля таго прымусова вярнуць положэнне прасування, частае калі распаковка сторункі вже змянілася. Вярненне дадзеных даных за дапамою bfcache вяртае іх практычна на тое ж месца, дзе яны былі.

Спісы продуктав прыводзяць гэты момент ў яшчэ большую яснасць. Чалавек выбірае каталог за дапамою чатырох-пяці фільтраў, праходзіць па дзёльгім спісе, выбірае адзін продукт і пасля вяртаецца назад. Якщо спіс адразу ж вяртаецца ў тым жа стане, процес чытання здаецца неперывным. Якщо ж сторунка перзагружаецца, практычна занову запрашваець даныя, адмахвалівае фільтры чыстаецца, або вяртаецца да першай строкі, сайт выглядае нестабільным, незалежна ад таго, насколькі хорашыя є метрыкі першай загрузкі.

Прыдатнасць — гэта не толькі швальнасць запуску прыемплікацыі. Гэта таксама і ступень, у якой продукт захоўвае ў людзях зусілля пад час пераходу межы экранамі.

Як прычына выкарыстоўвання методу unload таямніча знешкоджае яго паслугі

Аднай з прычын, чаму bfcache застаецца незаўважаным, є тое, што калі сторана не падходзіць для зберагання, нічога не выглядае як адказ на проблему. Браузер проста выкааноўвае звычную навігацыю па історыі. Усё продалжае працаваць; корыстувачы проста втрачаюць можлівасць мгновенага вярнуцца да поперадней становішчы.

Класычным вінаватцам являецца здарэнне unload. Стары код выкарыстоўвае яго для адправкі статыстыкі, звалічэння ресурсаў чы паведамлення серверу пра закрыцце стораны, выходзячы з гіпотэзы, што навігацыя завжды знишчае сторану і дае апошню можлівасць ўсё праканалізаваць.

Эта тэорыя большае часці не падходзіць да рэальнасці. Старонку можна ўзяць пад адстаўку для bfcache замест таго, каб яе знішчыць, а unload вялікі час ўжо не є надзеяным, бальш тым на мобільных прыстроях, дзе ён часта вовсе не выкананы. Працэздатнасць разлічваецца ў розных прыглядачах, але заданне слухальніка unload можа не дазволіць старонцы быць захаванай у bfcache ў дзеяных з іх. Чынныя рэкамендаціі платформы абоўсюдзе не рэкамендуюць unload і працоўнаюць з адбуванням жыццёвага циклу, якія падходзяць да сучаснага модэлю. На момент напісання Chrome таксама знаходзіцца ў процесе выключэння unload, таму для аптальнай інформацыі трэба пераканацца ў чынной документацыі прыглядача.

Адаптар нават не павінен быць частью вашага коду. Фрагменты для аналітыки, тэгі рэкламы, віджэты чат-падтрымкі і старэйшыя залежнасці інодзе рэгіструюць такі адаптар унутрана. Ён праходзіць перагляд коду, таму што не мае візуабельнага адказу, пры тым як можа пазбавіць стороннік оптымізацый на рэвэле з кожнага візіту на тую сторонку.

Замена unload не значыць проста перайменаванне эвэнту. Правильны заменік завісіць ад таго, для чаго на самай працоўвае код:

  • Даныя для аналітыки можна адправіць за дапамою navigator.sendBeacon() або належным чынам настроеныя запита fetch (напрыклад, з параметрам keepalive) калі виднасць сторонкі зменяецца на «спрыважана».
  • Паведамленні пра незявічаныя даныя формы можна выдаць за дапамою beforeunload, але такі адаптар трэба дадаць толькі тады, калі ёсць незявічаныя змены, і адключыць яго пасля таго, як змены буду зявічаныя, а не залишаць яго працаваць пра весь час існавання сторонкі.
  • Рэсурсы, якія зв’язаны з актыўной сторонай, можна паставіць на паузу і запусціць знову за дапамою падзеяў жытнёвага циклу, якія сумесны з bfcache, пра якіх пагаворыцца далей.
  • Шырэйшы урок: перайход на іншую сторону не означае заканчэння жыцця данай стороні. Код, пабудаваны на такой логіцы, вырашаецца менш надзяйным і повольнейшым, чым трэба.

    Адгукаванне пра вярнэнне за дапамою pageshow і pagehide

    Два з’явы абарануюць періад скрытнага стану. pagehide вызываецца, калі навігацыя выводзіць дакумент за межы экрана, а pageshow — калі навігацыя знову робіць дакумент актуальным, уключаючы варыянт вярнення з bfcache. Лепшы з’явы маюць атрыбут persisted. У з’яве pageshow значэнне persisted ў значэнні true, калі сторанка выйшла з bfcache; у з’яве pagehide гэта значэнне паказвае, што браузер прагне захаваць сторанку. На адзінаку з unload, pagehide спроектаваны так, каб можаць існаваць разам з bfcache.

    Нижэйшы фрагмент паказвае базовую форму. Функцыя-обрабоўчык pageshow вяртаеся рана пад час звычайнага завантажэння, таму логіка апшырання працюе толькі тады, калі вяртаецца зберажаная стороніца. Функцыя-обрабоўчык pagehide паставляе на паузу з’ўязкі у рэальны час, калі стороніца ўтаімаецца, незалежна ад таго, чыргава яе кэшуецца. Памочныя функцыі ўжоўвачы для вашай сабскладнай логіки прыкладнага програму.

    window.addEventListener("pageshow", (event) => {
      if (!event.persisted) {
        return;
      }
    
    refreshSessionState();
      refreshTimeSensitiveData();
    });
    
    window.addEventListener("pagehide", () => {
      pauseRealtimeConnections();
    });
    

    Зверніце ўвагу, чаго гэта не робіць: гэта не апшырвае ўсё занова. Перзавантажэнне всіх дадзенняў праз кожнае вярнэнне знішчыць большую частку корысты. Мета — апшырваць толькі тую інфармацыю, чыя правядлівасць можа значна зменіцца, пакуль стороніца застаецца у стане призупінення.

    Тое, што гэта значыць, залежыць ад стороніцы:

    • Галоўная стороніца новасей змагаць патрабаваць свежыя загалоўкі.
    • Экран абліковага кантэксту можа патрабаваць паказаць, чы сесія не была завернутая ў іншай вікночцы.
  • У кроку выкаскоўвання можа знадобіцца парабавіць перакананне ў наявнасці запасоў і цэнах.
  • Старонка з статычнымі дакументамі зазвычай можа абоўсюдзе паскочыць логіку вярнення да первачных настроек.
  • Праўяй паліпшэннем ёсць тое, што аплікацыя тепер можа розразліваць паветраную загрузку і вярненне да первачных настроек. Без такога разліку команды зазвычай выбіраюць между двума паслаблымі варыянтамі: ніколі не апдэйтуваты і рызыкуваць застарелым кантэнтам, альбо зноў запусціць цэлы процес ініцыялізацыі, відмовляючыся ад большай часткі швальнасці. Аплікацыя, якая розумее bfcache, адносіцца да вярнення да первачных настроек як да окремага этапу жыцёвага циклу, захоўваючы тое, што ўсё яшчэ ў чынным стане, і апдэйтуючы тое, чаму больш нельзя даверляць.

    Калі стан пасля вярнення стае проблемай правильнасці

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

    Разглянем пользователя, які відкрывае панель керування абонаментам, пераходзіць на іншую сторанку, выхаджае з другага вікна браузера і нарэшце натыкаецца на кнопку «Адназад». Вярнутая копія сторанкі можа яшчэ паказваць деталі з пярэдней сесіі. Браузер не порушае жадных правіл безпекі, запам’ятаваючы сторанку в межах той самай сесіі, але ваша прыкладна програма можа патрабаваць пераканаліцца, што сесія яшчэ дзейнае, перш чым разрашаць будучыя взаімадзеі.

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

    Звычайная рэакцыя — це абсалютна блокаваньне кэшавання. Гэта зазвычай занадто радикальна мера. Старонка можа застаць свой DOM і стан взаімадзеяння, адколі будуць апдараваны толькі тыя даны, якія павінны быць актуальнымі, і pageshow — гэта натуральны спосаб для такога супрацоўкі. Oficыянальныя рэкамендацыі чыста зазначаюць, што старонкі, якіх кантэнт часта зміняецца, можу запрашваць свежыя даны пасля восстановлення, замест таго каб абсалютна выключыць bfcache.

    Старонкі, чутлівыя да безпекі, як і раней, патрабуюць цялеспрямованых правілаў кэшавання і сесый, а спосаб, якім прыгледчыкі обрабоцваюць заголовкі на кшталт Cache-Control: no-store, постаўляецца змянамі. Напрыклад, Chrome пачаў дазволяць адзінам no-store-старонкам уваходзіць у bfcache, калі выпалоўваюць спецыяльныя умовы. Характэрнае ўскладненне — стваранне прыпускаў на аснове адной спрасцаванай канцэпцыі пра тое, як кожны прыгледчык обрабоцвае гэты заголовак; перад тым, як на ўсё гэта паспакоўвацца, трэба пераглянуць актуальную дакументацыю прыгледчыка.

    Больш адаптаваны спосаб — чыткая дэцізія:

    • кой стан можна безпечна захаваць такім, які ён є;
    • кой стан павінен быть перапрацаваны пасля вярнення;
    • кіе дзеянні корыстувальца завжды выклекваюць новую пераканаловку прав на сервере, незалежна ад таго, што паказвае інтэрфейс.

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

    Пазіранне дзейнасцяў дугага трымання пад час перыяду адстойкі

    Связі, такія як WebSockets, каналы IndexedDB, спакаваныя блокіраванні і запусканыя запиты, ускладняюць працę bfcache, адколі браузер павінен замарозіць сторанку, пакуль іншыя вкладкі та дасягі продовжваюць працаваць. Замарожаная сторанка, якая трывае спакаваныя блокіраванні або мае відкрытыя з’язкі з базайнамі дадзеных, можа стаць пераканалом для сторанак, якія ўсё ўжо актыўны. Правіла адпаведнасці разніцацца ў розных браузерах, і ў дазначальных случаях відкрыты або актыўны з’язак уже дастатній, каб сторанка не заляшалася ў кэшы. Рекамендуемы спосаб — адпусціць або призупініць такія рэсурсы, калі сторанка стае невидачай, а пасля зноў стварыць іх астаточна, калі яна з’являецца знову.

    Это не значыць, што трэба знішчыць кожнага слухальніка або спостерагача. Тыя элементы, якія знаходзяцца выключна ўнутрь стораніцы, напрыклад слухальнікі DOM, зазвычай можаць застацца без змян без небягі. Увагу трэба сфокусаваць на тым, што выходзіць за межы «заморожанай» дакументаў у зовнішнія системы, або на тым, што не павінна выглядаць актываючайся, калі ніхто не пераглядае стораніцу.

    Напрыклад, панель у рэальным часе можа закрыць свой WebSocket у момент pagehide і ачыніць новы, калі стораніца будзе вярнута. Рэалізацыя павінна захіщацца ад дуплікацый, таму што як звычайны пат канцэлераціі, так і працэўнік вярнення можа прабаваць наладзіць з’єднанне; адна функцыя connect(), якая пераканальваецца, чы ўжо існуе з’єднанне, — гэта просты спосаб перадаць яе ідемпатентнасць. Кэшувальнік IndexedDB можа закрыць свое з’єднанне з базай дадзеных перад призупінэнням і празьвычайна ачыніць яго знову, калі ён будзе патрэбны.

    Гэта дысцыпліна прыносіць парадкі не толькі для bfcache. Яна змушвае команду выявіць, хто ў власнасці кожны зовнішні ресурс, калі ён павінен існаваць і што будзе, калі дакумент стане неактыўным. Гэтыя угоды таксама важлівы для фонавых вікнаў, мобільных прыстроёў, якія замаражуюць сторунки, і перерваных сесій.

    Аплікацыі з адной сторункай таксама отрымаюць выгоду

    bfcache працюе з навігацыямі межу дакументамі, якімі керуе браузер. Змены маршрута, якія обрабоўваюцца ў JavaScript і пры якіх не завантажаецца новы дакумент, застаюцься пахоўна ў яго межах. Перыход з /products на /products/42 через кліентскі рутэр таксама залишаецца задачай, якую сама аплікацыя з адной сторункай і яе фрэймворк керуюць самі.

    Нават так, SPА-проекты маюць чымалыя перавагі. Люди часта пакідаюць такі прыемнікі, каб перейсці на адзінокую стороніцу, сайт трэцьей стороны, сервіс або іншы дапрыгун, а пазней вяртаюцца. У такім случае браузер можа запрашаць усю аплікацыю занову, замест таго каб зноў запрашаць пакеты, перзначаць кожны компонент і зноў запускаць настройкі. Oficыяльныя інструкцыі чытка паказваюць гэту перавагу, адзначаючы ў той жа час, што змены маршрутаў унутрь аплікацыі не належаць пад кантролем bfcache.

    Такія вярненняя можу адкрыць прыпускі на рэвэрсе:

    • Прыпуск, што ініцыялізацыя коранавага элемента будзе выконвана ў кожны раз, калі дакумент стане видным;
    • Слой дадзеных, які прыпускае, што його кэшы завжды пачынаюцца з порожніх дадзеных;
    • З’ўязак у рэальны час, які ствараецца занову, пакалі стары таксама вяртаецца у працэздатны стан;
    • Компонент, які адображае цифры, якія былі правымі на момент выходу і тепер можаць быць застарэлымі.

    Няма жаднага фрэймворка, які бы абстрагаваў сабе жыцёвы цикл самога прыглядача. Незалежна ад таго, чы вы вжываеце React, Vue, Angular чы Svelte, код все равно выконваецца ўнутры дакумента, які прыглядач можа зберагчыць і вярнуць. Фрэймворк добра справляецца з арганізацыяй стану, але не мае можлівасці сам за вас выявіць, якія даныя ўсё ще є чыннымі пасля перыванавлення. Напрыклад, у React компоненты не перзасілаюцца пад час вярнення з bfcache, таму эфекты, якія выканаліся пад час першага заванавлення, не будуць выкананы зноў; праслухальнік pageshow — гэта спосаб, яким прыкладненне даведаецца пра тое, што час прайшоў.

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

    Тэставанне bfcache за калікве хвілін

    bfcache застаецца ігнораваным часткова таму, што важкая з’ясавіць, чырэз яго ўсё працюе. Праўернутыя данні можу здавацца швыракімі, а панель «Сеть» малая кампанія, тым болей што восстанавленая стороніца абходзіць усю звычайную последовальнасць запитоў.

    У Chrome DevTools є спецыяльны апарат для перагляду стану bfcache, які знаходзіцца пад панеллю «Прыемленае». Вы яго запускаете, Chrome перейходзіць туды і назад, і апарат паведамляе, чырэз bfcache стороніца была восстанавлена. Калі стороніца не падпадае пад крэтыяры, DevTools паказвае конкрэтныя прычыны і вказывае, якія фрэмы ў цьму вінаватыя.

    Зробіце гэта часткай рутынных пераглядоў карыстоўнасці для важлівых стораніцаў, у чым случку пошуковых рэзультатаў, стацыянарных артыкулаў, каталогаў продуктав, панелей керування і будзь-якіх экранаў, якія корыстувальнікі часта адвідуюць. Запускайте гэты апарат таксама з увімкнутымі скрыптамі трэціх сторон, тым болей што крэтыяры часта блакуецца кодам, які знаходзіцца не ў вашым сабе складзе.

    Для данных з мясцовых выкарыстоўванняў інфармацыя notRestoredReasons, якая выклікаецца через API Performance (у рэкордах часу навігацыі), можа падказаць, чаму рэальныя навігацыі ў історыі не былі восстановлены. Падтрымка гэтага функцыяналу не ўсюды є, таму трэба спрыятаць яго як прагрэсіўны інструмент, а не як элемент, на які будзе рэгулярна спакоювацца ваш код у разных прыгледачах. Ён заступнае значэнне, калі бо жодны локальны тест не можа перадаць усі расширэння прыгледачаў, сторонніе iframe-ы, ачыненыя з’ўязкі, заголовкі чы іншыя умовы прыгледача, якія выкарыстоўваюць вашы корыстувальнікі. Лёгкай альтэрнатываю є фіксацыя значэння event.persisted з евенту pageshow у вашых аналітых дадзенах, каб вы моглі вырачыць рэальны парактар адвізавання.

    Не лячыце, што кожна навігацыя па історыі будзе запісвалася ў кэш. Браузеры адмахваюць кэшаваныя копіі, каб кераваць памяцю, а дзеяння дэйтчыкаў блокавання часам знаходзяцца па захопленню самай сторонікі. Рэалістычная мета — адмахнуцца ад тых дэйтчыкаў, якія можна усунуць, і правільна кераваць вярненням стану, калі гэта трапляецца.

    Заключанне

    bfcache лёгка працяжваць, аднойчы таму, што нічога ў вашай базе коду яго не актывае. Няма ні пакета, ні компонента, ні файла налаштавання, якія бы паказалі яго як частку архітектуры; браузер проста прагчы даўць корыстнікам кращы досвяд. Гэтая невиднасць паўтараецца з двух бакоў: калі ён працюе, корыстнікі магуць навігаваць па історыі практычна момантальна, без значных змян у коде; калі ён блакуецца, сайт сповольняецца без жадных памылак; а калі вярнення стану адбываецца неправільна, застарэлы стан знову з’яўляецца, таму што прыкладнэе рашэнне вырашае, што вярнення завжды значыць перзагрузку.

    Практычны спіс пераглядзаных сторонніх сторынак:

    • Адзьёмайце слухачывыя функцыі unload, укладзеныя таксама і спісакамі трэціх сторон, і перанесіце ўсю ўпрацоўку на pagehide, visibilitychange або sendBeacon().
    • Прыўяжыце beforeunload толькі тады, калі є незявішаныя змены.
    • Закрыйце або націсніце паузу зовнішнім з’ўязкам у pagehide і па ўвоскрэсценні сторанніка зноў наладзіце ўпрацоўку.
    • Ўжыце pageshow разам з event.persisted, каб апавежаць толькі тыя данні, якія могу стаць застарэлымі, і працаваць з перакананнямі ў правах на серверы.
    • Адрабоўваце тэст кеша ў інструментах развіцця «назад/вперад» і стежыце за рэальнымі тэчкамі воскрэсцення, калі API дазволяюць гэта.

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