ব্লগে ফিরে যান

Speculation Rules এবং Prerendering: Prefetch করা পেজ সম্পর্কে Analytics যা ভুল বোঝে

Chrome-এর Speculation Rules API একজন ব্যবহারকারীর ক্লিক করার আগেই একটি পেজ রেন্ডার করতে পারে। এটি কীভাবে সরল analytics-কে বিকৃত করে — এবং কীভাবে cookieless, edge-ভিত্তিক পরিমাপ সৎ থাকে, তা এখানে আলোচনা করা হলো।

যে পেজটি ক্লিকের আগেই লোড হয়ে গেল

Speculation Rules API, যা এখন Chromium ব্রাউজারগুলোতে ব্যাপকভাবে চালু হয়েছে, একটি সাইটকে ঘোষণা করতে দেয় যে ব্রাউজার কোন URL-গুলো নেভিগেশনের আগে prefetch বা সম্পূর্ণ prerender করবে। যখন কোনো ব্যবহারকারী হোভার করে বা আগ্রহ প্রকাশ করে, তখন গন্তব্য পেজটি ইতিমধ্যেই একটি লুকানো ট্যাবে রেন্ডার হয়ে থাকতে পারে, এরপর তাৎক্ষণিকভাবে বদলে দেওয়া হয়। এর লাভ হলো অ্যাক্টিভেশনের সময় প্রায়-শূন্য Largest Contentful Paint। কিন্তু পরিমাপের জন্য সমস্যাটি হলো, একটি prerender করা পেজ আপনার স্ক্রিপ্টগুলো চালায় কেউ সেটি ভিজিট করার সিদ্ধান্ত নেওয়ার আগেই

আপনার analytics যদি লোড হওয়ার সময় একটি pageview ফায়ার করে, তবে prerendering আপনার গণনায় এমন ভিজিট যোগ করে যা কখনও ঘটেনি। আরও খারাপ, এটি পারফরম্যান্স ডেটাকে বিকৃত করে: ব্যাকগ্রাউন্ডে prerender করা একটি পেজ এমন টাইমিং রেকর্ড করে যার সঙ্গে একজন প্রকৃত ব্যবহারকারীর অভিজ্ঞতার কোনো সম্পর্ক নেই।

Prerender চলাকালীন আসলে কী ঘটে

একটি prerender করা ডকুমেন্ট স্বাভাবিকভাবে এক্সিকিউট হয়, কিন্তু একটি বিশেষ lifecycle অবস্থায়। document.prerendering থাকে true, এবং পেজটি এখনও দৃশ্যমান ট্যাবে অ্যাক্টিভেট হয়নি। prerenderingchange ইভেন্টটি তখন — এবং কেবল তখনই — ফায়ার হয় যখন ব্যবহারকারী প্রকৃতপক্ষে সেখানে নেভিগেট করে। অনেক prerender কখনও অ্যাক্টিভেটই হয় না; ব্রাউজার সেগুলো বাতিল করে দিতে পারে।

এটি দুটি কারণে গুরুত্বপূর্ণ:

  1. গণনা। DOMContentLoaded-এ একটি সরল sendBeacon এমন একটি ডকুমেন্টের জন্য pageview রিপোর্ট করবে যা হয়তো কখনও দেখাই হবে না।
  2. পারফরম্যান্স অ্যাট্রিবিউশন। Core Web Vitals সংজ্ঞায়িত হয় ব্যবহারকারী-উপলব্ধ লোডিং সাপেক্ষে। web-vitals লাইব্রেরি এবং অন্তর্নিহিত Paint Timing ও Event Timing স্পেকগুলো prerender-এর হিসাব রাখে অ্যাক্টিভেশন পয়েন্ট থেকে পরিমাপ করে, মূল নেভিগেশন শুরুর সময় থেকে নয়। সেই সচেতনতা ছাড়া সংগ্রহ করা একটি মেট্রিক কেবল ভুল।

সঠিক প্যাটার্ন

ওয়েব প্ল্যাটফর্ম আপনাকে পরিষ্কার সিগন্যাল দেয়। যেকোনো পরিমাপ ততক্ষণ পর্যন্ত স্থগিত রাখুন যতক্ষণ না পেজটি প্রকৃতপক্ষে একজন ব্যক্তির কাছে দৃশ্যমান হয়:

if (document.prerendering) {
  document.addEventListener('prerenderingchange', recordPageview, { once: true });
} else {
  recordPageview();
}

টাইমিংয়ের জন্য, PerformanceNavigationTiming.activationStart নেভিগেশন শুরু এবং অ্যাক্টিভেশনের মধ্যকার অফসেট দেয়। যেকোনো paint বা interaction টাইমস্ট্যাম্প সেই মানের সাপেক্ষে পরিমাপ করা উচিত, ঋণাত্মক মানগুলোকে শূন্যে ক্ল্যাম্প করে। Google-এর web-vitals লাইব্রেরি অভ্যন্তরীণভাবে ঠিক এটাই করে, তাই আপনি যদি নিজে LCP বা INP গণনা করেন, তবে সেই যুক্তি অনুসরণ করুন।

একই শৃঙ্খলা prefetch-এর ক্ষেত্রেও প্রযোজ্য, যা prerender-এর হালকা সংস্করণ। Prefetch কেবল রেসপন্সটি ফেচ করে; এটি স্ক্রিপ্ট এক্সিকিউট করে না, তাই এটি সরাসরি analytics-কে খুব কমই দূষিত করে। কিন্তু এটি ব্যান্ডউইথ খরচ করে এবং সার্ভার-সাইড রিকোয়েস্ট লগকে বিকৃত করতে পারে — এটি একটি স্মারক যে raw লগ গণনা এবং প্রকৃত ভিজিট আগের চেয়ে বেশি ভিন্ন হয়ে যাচ্ছে।

কুকি বা ক্লায়েন্ট state ছাড়া কেন এটি সহজতর

Speculation-চালিত prerender stateful ট্র্যাকারগুলোর জন্য একটি মাথাব্যথা। যে prerender করা ডকুমেন্ট শনাক্তকারী সেট করে, একটি সেশন হাইড্রেট করে, বা স্টোরেজে লেখে, তা অনুমানভিত্তিকভাবে করে — এমন একটি ভিজিটের জন্য যা হয়তো বাতিল হয়ে যাবে। সেগুলো পরিষ্কার করা, চূড়ান্ত প্রকৃত অ্যাক্টিভেশনের বিপরীতে ডিডুপ্লিকেট করা, এবং cross-page পরিচয় মিলিয়ে নেওয়া ত্রুটি এবং গোপনীয়তা ঝুঁকির একটি প্রকৃত উৎস হয়ে ওঠে।

Monoid এই সম্পূর্ণ শ্রেণির সমস্যাকে এড়িয়ে যায়। আমরা ডিভাইসে কিছুই সংরক্ষণ করি না — কোনো কুকি নেই, কোনো localStorage নেই, কোনো fingerprint নেই। তৈরি করে পরে বাতিল করার মতো কোনো অনুমানভিত্তিক সেশন নেই। পরিমাপ হলো একটি একক, stateless সিগন্যাল যা আমরা কেবল তখনই নির্গত করি যখন পেজটি বাস্তব হয়। যেহেতু সংগ্রহ Cloudflare edge-এ চলে, তাই aggregation এমন ডেটার উপর ঘটে যা ইতিমধ্যেই প্রকৃত, অ্যাক্টিভেট হওয়া নেভিগেশন প্রতিফলিত করে, ব্রাউজারের আশাবাদী অনুমানের পরিবর্তে।

এটি হলো data minimisation যা আপনার পক্ষে কাজ করছে। যখন আপনি এমন কিছু সংগ্রহ করেন না যা পরিষ্কার করার প্রয়োজন, তখন অনুমানভিত্তিক রেন্ডারিং অনাথ পরিচয় রেকর্ড বা ডুপ্লিকেট প্রোফাইল তৈরি করে না। এর অর্থ কেবল আপনি গণনা করার আগে prerenderingchange-এর জন্য অপেক্ষা করেন।

Prerender-নিরাপদ analytics-এর জন্য একটি চেকলিস্ট

  • document.prerendering এবং prerenderingchange ইভেন্টের উপর pageview নির্গমন gate করুন।
  • LCP, FCP এবং INP গণনা করুন activationStart-এর সাপেক্ষে, অথবা এমন একটি লাইব্রেরি ব্যবহার করুন যা ইতিমধ্যেই তা করে।
  • সার্ভার রিকোয়েস্ট লগকে প্রকৃত ভিজিটের একটি superset হিসেবে বিবেচনা করুন, তাদের প্রতিনিধি হিসেবে নয়।
  • নিশ্চিত করুন যে আপনার Content-Security-Policy একটি অ্যাক্টিভেট হওয়া ডকুমেন্ট থেকে আপনার measurement endpoint-এ পৌঁছানোর অনুমতি দেয়; Chrome DevTools-এর prerender pane-এ পরীক্ষা করুন।
  • ডিভাইস স্টোরেজে যেকোনো অনুমানভিত্তিক write এড়িয়ে চলুন — prerender-সঠিক হওয়ার সবচেয়ে পরিষ্কার উপায় হলো কোনো client state একেবারেই না রাখা।

বৃহত্তর বিষয়টি

প্রতিটি নতুন পারফরম্যান্স primitive — bfcache, soft navigation, এবং এখন speculation rules — নীরবে সেই পুরনো ধারণাটি ভেঙে দেয় যে একটি পেজ লোড মানে একটি মানব ভিজিট। যে analytics কুকি এবং stateful সেশনের উপর নির্ভর করে, তাকে ক্রমাগত আরও বেশি reconciliation যুক্তি জুড়তে হয়। যে analytics প্রকৃত দৃশ্যমানতার মুহূর্তে একটি stateless ইভেন্ট পরিমাপ করে, তার কেবল প্ল্যাটফর্মের lifecycle ইভেন্টগুলোকে সম্মান করা প্রয়োজন। দ্রুততর পেজ এবং সৎ সংখ্যা পরস্পরবিরোধী নয়; আপনাকে কেবল সঠিক মুহূর্তে গণনা করতে হবে।

Sources

Comments

Loading comments…