![Frontender's notes [ru] — пост в ТГ канале](/api/proxy-image?url=https%3A%2F%2Fcdn4.telesco.pe%2Ffile%2FAHM_HHrgyAV788i8qYH27sfojxiA-cABJzEJ5R6OVuxZvSaVHotHh0O-8t1w91ZxLD3uF7FkcOsNjfK5odWNWxl9f-mk77-thm6i9teijSMRwsp8jRAiDnqoqPF2asJ5UAcTfz9DT9WamBq-nm4nGmH1BJbiq770tRSm-gspiI76Kc6WeUt15AZbFA3AGYxMPdAXxzoR7QgatFQ0jljjH3VoT4IjCAgooxeF6dZapY9B1HDvAL4DXylsDfpQ17g9F4HjJOEz5tQE6kK4zPgA0K_eV_s-un1n_jUXqShNNmvYCr9GPAvAUF0dhlHKLNQOlMV6O-y1pif6bMrHmzCmHw.jpg)
bfcache в SPA: как не потерять мгновенный back/forward UX и не проснуться со старым состояниемbfcache - не кэш данных, а заморозка всей страницы: DOM, JS heap, scroll, router state и React/Vue-приложение. В production он ускоряет возврат назад/вперед, но часто ломается из-за cleanup «на всякий случай» или восстанавливает устаревшую сессию.Диагностика восстановленияГлавный сигнал - pageshow. При возврате из bfcache load не сработает, поэтому bootstrap, завязанный только на DOMContentLoaded / load, пропустит важную логику.window.addEventListener('pageshow', e => { if (e.persisted) { revalidateCriticalQueries(); syncAuthState(); reconnectRealtime(); resumeTimers(); }});window.addEventListener('pagehide', e => { if (e.persisted) { pausePolling(); closeEphemeralConnections(); }});Что блокирует bfcacheЧастые причины:* unload handler;* лишний beforeunload;* WebSocket, WebRTC, BroadcastChannel, Web Locks;* незавершенные IndexedDB-транзакции;* активные fetch/stream-операции;* Cache-Control: no-store;* сторонние скрипты с unload.Типичная ошибка SPA - вешать unload для cleanup. Используйте pagehide, но не уничтожайте store и router state, если event.persisted === true.Как искать причиныВ Chrome DevTools откройте Application - Back/forward cache и запустите тест навигации. DevTools покажет blockers: active connection, unsupported feature, unload handler.Для логов используйте pageshow.persisted и pagehide.persisted. performance.getEntriesByType('navigation')[0].type === 'back_forward' полезен, но не гарантирует успешный restore из bfcache.Что восстанавливать после pageshowПроверяйте только внешнее состояние: auth/session, критичные query cache, realtime, polling, feature flags, time-based данные и синхронизацию вкладок.Вывод:bfcache - это продолжение жизни страницы, поэтому надежная SPA не перезапускается целиком, а точечно возобновляет ресурсы и пересинхронизирует данные.
![Frontender's notes [ru] — пост в ТГ канале](/api/proxy-image?url=https%3A%2F%2Fcdn4.telesco.pe%2Ffile%2FhjhBB-txSNe1jQ4i7zCmvpMqRbfo7k_y0jU0QPQf17_i3itVOKBh1sDjUUPmBakeZYLDTVt1tAdGaU8Ggy8fE4DpiOQyYQEgyRG_KO1piQSiTXG8IPnJitGuDAg822U8GCbAmtbYjLk5vio9eKbeIFAIhtmZuEF2_UGKkCS_foaXIff0G7cI8QrS7P01kBYJimq6c_tbKc8FrXpZHYVOhgkQWATIINqi7AGVKOgLabf5uN0PyltwSOcrS7enVSyz_i78XPLGKUds9c_yii6pAXBFwOkKwjyAQ3C0g_fC2gJ-xYbHZIAgnWZQwHEnwQ2Nq9kbrsEpB6xCBJOlrdLkIQ.jpg)
![Frontender's notes [ru] — пост в ТГ канале](/api/proxy-image?url=https%3A%2F%2Fcdn4.telesco.pe%2Ffile%2Fmq6J3BOu-WRPDcw2MgRVrLu4NAc1xxTaaHPoLvmU4ifw8Do4CTE8QEiYX-ZFXZYetTAshSYVDnUquRYu-sYM60YvSAsEnHlbO1EUWVexP4xmRHniZrKbsS5xtAOYmb8B82CUO5CUQBSWcR82xcgYHzbrA50dcMCIVJWLWOX0Wzg5hMgtIV1XY7_0AKtB8b5sjU8ekFppr-vaI9NG0JiN0havrzPIPDZH5XuDd_Ed7yBeQmSsYb9P-ctm_W57s4fvBBbj7N333nFLpTHX7rrrlW8ve_7c6Knv0udGBMRYHwRrhFNcG4UkYuTDIdb0ssQcj95ksr7nDVA5BGAQ0v5c5Q.jpg)
![Frontender's notes [ru] — пост в ТГ канале](/api/proxy-image?url=https%3A%2F%2Fcdn4.telesco.pe%2Ffile%2FoPyv9ua3ogzgFDCH1kiY7P5Et7q6Dx77NeS_EqLa01PnQH7Y4BTooZabZjtcm7Qmd-uex-vuSEN_tOjsGCgE8-JQcha1Y3eqVlxngwe_SqrhT38JpVm9bnOxfQw0qCsABhsUlbLpwnD8vOezXYCNAyCvSB5HRRZHNgBAbQWAPvwVC9QeAsSnFj9s1yr7lQ4B5cGddB7bLM-X6qvADZU8MMsaoJvSGe8MuODOugxFf2EvM2bxEIFPi6zAv4vzPU51SXVzbcWgjHdfu77qQraQ2dpahGIKd7BxO2uWjxZCkDSddcW7og-1yfe8-mr7jzFta2Wvk4E4azqhTlmanGXr3g.jpg)
![Frontender's notes [ru] — пост в ТГ канале](/api/proxy-image?url=https%3A%2F%2Fcdn4.telesco.pe%2Ffile%2Frv_x950qi0qw9is9Tzr4OJ84C8WpnwcoCal_tsLmMTk3cFV-V0aWGb1eyLMuWUgNyxtE7Vwd05DlzKwClWveEb9kTyRe25NZxY3qUaclzIL6j5YdL_7-jpeNPME_ZIV6VXq1p6B5jUhB3nFFqTTDTOIvQkeQHRPsCH5mRwUv0a9JNRUpA5OQ_4xUWpxatNX3b69xtP8RIAQiUis-LpfooQoAQddpzK4tgNWFM1dAuVTnsq7DyMR2h-1Klk1RyKarxLJJ-OPELUdXMWiCEJolI4Q4ouAFVpE00xgts7nTzwgge6Jb-V9mNNFMBM41gfw37pP0vl_YbYjygLJnSNGXLA.jpg)
![Frontender's notes [ru] — пост в ТГ канале](/api/proxy-image?url=https%3A%2F%2Fcdn4.telesco.pe%2Ffile%2FRIHaNRr6eg3LsH07VsijQ9rSCELQehdpz-maNJXhksNjr7KGxmLa-PaJhjDVPSy9_v6g6BMWjwBStFYHUZM7ZtGBvpyDTmqBDG67DtarMovtNdpKgyRQxA7Vtn-oc1hgdOpyHkqp5ApQC9npv46Kv9ei64El5CKZd3e1aiGh3plsCPZg4phGwFSssclTOcPk3vMgC9J9QazKGO9HtV00urQn3eKsmi7c9RSMOlEGe6hTBbO5mMLs08ijB-C7iIt1fzbpJZEqReCcy-O7mODBzqii0-fN9b-5KqSgREJ69l-BmP4MYRiqruyQ8dinBxLsLwwAAYut8RfG-zDPOn230Q.jpg)
![Frontender's notes [ru] — пост в ТГ канале](/api/proxy-image?url=https%3A%2F%2Fcdn4.telesco.pe%2Ffile%2Fqtpi_La8jQa3yKaNDzkfQzFNPQQ3aQ2BT4Ub25f3asP6yxvZXFtvUU-KjajBDpq-l3lKp6cDEYoDDcvhmVEqdqFfs_VnlxoKy4MZCUzQaO-0wABshPdzGvZGZvQ47ZPFTvVqpo8qPJgShh7zs-t1-ADp4-p6tmv7DFyeXi8VfWugXDN6b3tq9mOInI_IjQmYODbY6RVf3SOjcBdyTUdbonLMHx3jT2T5_Ztnm3mOe0spt1Dhs27NO5HfLzkSp10ucg6ilY6CpVYr_036U5a2BRJMsUJ_Qe4w9Qc4yRwQX4ihv2qdmfFHzLW6hDpvRvWecJ1IwZW45UwR37tlUBMYKg.jpg)
![Frontender's notes [ru] — пост в ТГ канале](/api/proxy-image?url=https%3A%2F%2Fcdn4.telesco.pe%2Ffile%2FkMrjpVnrLsCELGX_Dskwg1dYpLDxubIECq4EUOpf8KpJHs7lPpsYPkjUFPYc6GUcJ4MKdvC23jzuRO598vR-AwKJOMu5SIBb8u1llyDDQzUsfu-GZqYEorzhrMcbXg_2ksDy4IUGOScKsj7APEjrn6LcUR4XdtgmJw64yQCq2hbXbZW2esMQCOYF7FSheff267qy6e17QIl-ih99UjztbJCt98_koXHyeSik7ysAvGNzyqCe6SXM3dwOqJCppR9AfEOv8z5Ztmx56-NdDvew3HXbhyYnh6aI8M6vQhAXwpZrC6Na0Bp-397u1ZEp3CEKbjGV6IXS2iYqQt5xZBveww.jpg)