వినియోగదారులు బ్రౌజర్లోని ఇతర కంట్రోల్ల కంటే బ్యాక్ బటన్ను చాలా తరచుగా నొక్కుతారు. వారు వెళ్ళిన చోటే, మునుపటి స్క్రీన్ వెంటనే కనిపించాలని ఆశిస్తారు. ఆధునిక బ్రౌజర్లు back/forward cache, లేదా bfcache ద్వారా ఆ అంచనాను నెరవేరుస్తాయి. మీరు ఒక పేజీ నుండి వేరే పేజీకి వెళ్ళినప్పుడు, బ్రౌజర్ ఆ పేజీని పూర్తిగా తొలగించకుండా మెమరీలో ఫ్రీజ్ (freeze) చేస్తుంది. మీరు తిరిగి వచ్చినప్పుడు, అది ఒక స్నాప్షాట్ను (snapshot) పునరుద్ధరిస్తుంది. బ్రౌజర్ HTML పార్సింగ్ చేయడం, JavaScriptను మళ్ళీ అమలు చేయడం మరియు లేఅవుట్ను తిరిగి లెక్కించడం వంటి పనులను వదిలేస్తుంది. పేజీ ఎప్పుడూ పూర్తిగా ఆగిపోలేదు కాబట్టి, ఫలితం తక్షణమే జరిగినట్లు అనిపిస్తుంది.
bfcache నిజంగా ఏమి చేస్తుంది
సాధారణ పేజీ లోడ్ అవ్వడం అనేది ఖర్చుతో కూడుకున్న పని. బ్రౌజర్ రిసోర్స్లను పొందడం, HTMLని టోకనైజ్ చేయడం, DOMని నిర్మించడం, స్క్రిప్ట్లను రన్ చేయడం, స్టైల్స్ను పరిష్కరించడం, లేఅవుట్ను నిర్వహించడం, పిక్సెల్లను పెయింట్ చేయడం మరియు లేయర్లను కాంపోజిట్ చేయడం వంటి పనులను చేయాలి. bfcache ఆ పేజీని RAMలో ఫ్రీజ్డ్ స్టేట్లో ఉంచడం ద్వారా ఇవన్నీ దాదాపుగా తప్పించుకుంటుంది. ఇది డిస్క్ క్యాష్ (disk cache) కాదు. వినియోగదారు తదుపరి పేజీని చదువుతున్నప్పుడు, JavaScript heap, స్క్రోల్ పొజిషన్ మరియు ఫారమ్ స్టేట్తో సహా రెండర్ చేయబడిన పేజీ మెమరీలో ఉంటుంది. వినియోగదారు బ్యాక్ క్లిక్ చేసినప్పుడు, బ్రౌజర్ ఆ స్నాప్షాట్ను అన్ఫ్రీజ్ చేసి pageshow ఈవెంట్ను ఫైర్ చేస్తుంది. నెట్వర్క్ను తాకకుండా లేదా లేఅవుట్ను మొదటి నుండి చేయకుండానే పేజీ మళ్ళీ ప్రారంభమవుతుంది. నెమ్మదైన పరికరాలు లేదా సరిగ్గా లేని కనెక్షన్ ఉన్న వినియోగదారులకు, bfcache పునరుద్ధరణకు మరియు కొత్త లోడ్కు మధ్య తేడా వందల మిల్లీసెకన్లు లేదా అంతకంటే ఎక్కువ ఉండవచ్చు.
దేనివల్ల ఇది విఫలమవుతుంది
bfcacheని ఖచ్చితంగా ఏది అడ్డుకుంటుందో తెలుసుకోవడానికి ఒక డెవలపర్ ఇటీవల ఒక ప్రయోగం చేశారు. వారు ఆరుగురు అనుమానిత బ్లాకర్లను పరీక్షించేలా ఆరు సాధారణ పేజీలను రూపొందించారు, ఆపై వేరే పేజీకి వెళ్లి మళ్ళీ బ్యాక్ నొక్కారు. ఫలితాలు స్పష్టంగా ఉన్నాయి.
ఎటువంటి అసాధారణ హెడర్లు లేదా స్క్రిప్ట్లు లేని బేస్లైన్ పేజీ విజయవంతంగా పునరుద్ధరించబడింది. beforeunload లిజనర్ ఉన్న పేజీ కూడా ఎటువంటి సమస్య లేకుండా పునరుద్ధరించబడింది. ఆశ్చర్యకరంగా, Cache-Control: no-storeతో అందించబడిన పేజీ కూడా bfcacheలోకి ప్రవేశించింది, ఇది పాత మార్గదర్శకాలను వ్యతిరేకిస్తోంది. ఫ్రీజ్ చేయడానికి చాలా డైనమిక్గా అనిపించే లైవ్ బ్లాగ్ ఆర్టికల్ కూడా విజయవంతంగా పునరుద్ధరించబడింది.
రెండు పేజీలు విఫలమయ్యాయి. unload ఈవెంట్ లిజనర్ ఉన్న పేజీ పునరుద్ధరించబడలేదు. ఓపెన్ WebSocket కనెక్షన్ ఉన్న పేజీ కూడా బ్లాక్ చేయబడింది. ఈ రెండు వైఫల్యాలు ప్రతిరోజూ రియల్ ప్రొడక్షన్ సైట్లను ఇబ్బంది పెట్టే ట్రాప్లను (traps) సూచిస్తున్నాయి.
unload ఈవెంట్ ట్రాప్
చివరి నిమిషంలో క్లీనప్ (cleanup) చేయడానికి unload ఈవెంట్ చాలా కాలంగా ప్రామాణిక సంకేతంగా ఉంది. అనలిటిక్స్ బీకన్లను ఫ్లష్ చేయడానికి, టైమర్లను ఆపడానికి లేదా తాత్కాలిక స్టేట్ను తుడిచివేయడానికి డెవలపర్లు దీనిని ఉపయోగిస్తారు. సమస్య ఏమిటంటే, పేజీ మళ్ళీ తిరిగి వచ్చే అవకాశం ఉందని భావించి bfcache నిర్మించబడింది. బ్రౌజర్ ఒక unload లిజర్ను చూస్తే, ఆ పేజీ పూర్తిగా తొలగించబడాలని భావిస్తుంది మరియు దానిని ఫ్రీజ్ చేయడానికి నిరాకరిస్తుంది. అనుసంధానించబడిన ఫంక్షన్ ఖాళీగా ఉన్నా కూడా అది ముఖ్యం కాదు. ఆ లిజనర్ ఉండటమే ప్రతి ఆధునిక బ్రౌజర్లో క్యాషింగ్ను నిలిపివేయడానికి సరిపోతుంది.
దీనికి ప్రత్యామ్నాయం pagehide. ఈ ఈవెంట్ పేజీ bfcache కోసం ఫ్రీజ్ చేయబడుతున్నప్పుడు మరియు అది నిజంగా తొలగించబడుతున్నప్పుడు కూడా ఫైర్ అవుతుంది. మీరు ఈ రెండింటి మధ్య తేడాను గుర్తించాలనుకుంటే, పేజీ bfcacheలోకి వెళ్తున్నప్పుడు event.persisted ప్రాపర్టీ trueగా ఉంటుంది. అయితే, చాలా టేర్డౌన్ (teardown) పనులకు pagehide సరిపోతుంది. క్లీనప్ లాజిక్ను unload నుండి pagehideలోకి మార్చండి. ఆపై థర్డ్-పార్టీ అనలిటిక్స్ స్నిప్పెట్లు లేదా పాత ప్లగిన్లలో ఉన్న వాటితో సహా ప్రతి unload లిజర్ను పూర్తిగా తొలగించండి.
యాక్టివ్ కనెక్షన్ ట్రాప్స్
ఓపెన్ నెట్వర్క్ లేదా స్టోరేజ్ కనెక్షన్ మీ పేజీ ఇంకా పని చేస్తోందని సూచిస్తుంది. నావిగేషన్ సమయంలో బ్రౌజర్ యాక్టివ్ రిసోర్స్లను తనిఖీ చేస్తుంది. ఒకవేళ ఓపెన్ WebSocket, యాక్టివ్ WebRTC పీర్ కనెక్షన్ లేదా ఇంకా కొనసాగుతున్న IndexedDB కనెక్షన్ కనిపిస్తే, అది ఫ్రీజ్ ప్రక్రియను నిలిపివేసి పేజీని సాధారణంగా తొలగిస్తుంది. డేటా (bytes) ఇంకా ప్రవహిస్తూ ఉన్నప్పుడు స్నాప్షాట్ను నమ్మలేము.
మీరు ఈ రిసోర్స్లను pagehide లిజనర్ లోపల మూసివేయాలి. మీ WebSocket యొక్క close మెథడ్ను కాల్ చేయండి. WebRTC పీర్ కనెక్షన్లను నిలిపివేయండి. పెండింగ్లో ఉన్న ఏవైనా IndexedDB లావాదేవీలను (transactions) అబోర్ట్ చేయండి లేదా కమిట్ చేయండి. వినియోగదారు తిరిగి వచ్చినప్పుడు మీ యాప్కు ఆ ఛానెల్లు అవసరమైతే, వాటిని pageshow లోపల మళ్ళీ తెరవండి. ఈ close-on-pagehide, restore-on-pageshow విధానం ఫంక్షనాలిటీని కోల్పోకుండా పేజీని తక్షణ బ్యాక్ నావిగేషన్కు సిద్ధంగా ఉంచుతుంది.
no-store సర్ప్రైజ్
ఏళ్ల తరబడి, Cache-Control: no-store అనేది bfcacheని నిరోధిస్తుందని అందరూ భావించేవారు. Chrome 2025లో ఆ ప్రవర్తనను మార్చింది. no-storeతో అందించబడిన పేజీ ఇప్పుడు bfcacheలోకి ప్రవేశించగలదు. సేవ్ చేయబడిన స్టేట్ను చెల్లకుండా చేసే విధంగా అథెంటికేషన్ స్టేట్లు లేదా కుకీలు మారితేనే బ్రౌజర్ ఆ ఫ్రీజ్డ్ స్నాప్షాట్ను తొలగిస్తుంది. మీరు no-storeని
