Storage APIs
Brauzerdagi to'rtta asosiy saqlash vositasi — Cookie, localStorage, sessionStorage, IndexedDB — ularning hajmi, umri, sinxron/asinxron ishlashi, va bularning barchasi V8 heap'idan tashqarida, diskda, origin bo'yicha qanday saqlanishi.
59-dars
Storage APIs
Brauzer sahifani yopib qo'ysangiz — JS'dagi barcha o'zgaruvchilar, obyektlar yo'qoladi (chunki ular faqat RAM'da, V8 heap'ida yashaydi). Agar ma'lumotni saqlab qolish kerak bo'lsa (foydalanuvchi sozlamalari, savat, login holati) — brauzer buning uchun bir nechta Storage API taqdim qiladi, ular ma'lumotni diskka yozadi, sahifa yopilsa ham yo'qolmaydi.
To'rtta asosiy variant bor: Cookie, localStorage, sessionStorage, IndexedDB. Ularning har biri — boshqa maqsad, boshqa hajm, boshqa umr davomiyligi uchun mo'ljallangan.
1. Cookie — eng qadimiy, server bilan bog'liq
document.cookie = "username=Ali; max-age=3600; path=/";
Cookie — 1994-yilda, HTTP protokoli holat (state) saqlamasligi muammosini yechish uchun yaratilgan (HTTP — stateless: server har so'rovni "birinchi marta ko'rganday" qabul qiladi). Cookie'ning eng muhim xususiyati: u har bir HTTP so'rov bilan avtomatik serverga yuboriladi.
Brauzer → Server: GET /profil
Header: Cookie: username=Ali
Bu — nima uchun login holati "eslab qolinishi" mumkinligining asosi: server cookie'ga qarab, "bu — Ali" deb bilib oladi, har safar parol so'ramaydi.
Cheklovlar:
- Hajmi — ~4KB atrofida (juda kichik)
- Har bir so'rov bilan yuboriladi — katta cookie, har bir so'rovni sekinlashtiradi (rasm, CSS, JS fayllar so'ralganda ham cookie ketaveradi)
HttpOnlybayrog'i bilan yaratilsa — JS orqali umuman o'qib bo'lmaydi (faqat server ko'radi) — bu XSS hujumlaridan himoya uchun muhim
2. localStorage — doimiy, faqat brauzerda
localStorage.setItem('theme', 'dark');
localStorage.getItem('theme'); // "dark"
localStorage.removeItem('theme');
localStorage — 2009-yilda, HTML5 bilan birga kiritilgan, cookie'ning "har doim serverga yuborilish" muammosini yechish uchun. Ma'lumot — faqat brauzerda qoladi, serverga hech qachon avtomatik yuborilmaydi.
Xususiyatlari:
- Hajmi — ~5-10MB (brauzerga qarab farq qiladi)
- Umrbod saqlanadi — foydalanuvchi qo'lda tozalamaguncha, yoki kod orqali o'chirilmaguncha (brauzer yopilsa ham, kompyuter qayta yoqilsa ham — turadi)
- Faqat string saqlaydi — obyekt saqlash uchun
JSON.stringify/JSON.parsekerak:
localStorage.setItem('user', JSON.stringify({ name: 'Ali', age: 25 }));
const user = JSON.parse(localStorage.getItem('user'));
Sinxron API — bu muhim nuance: localStorage.setItem() chaqirilganda, brauzer darhol, Call Stack'ni bloklab, diskka yozadi (yoki hech bo'lmasa, diskka yozish tasdiqlanguncha kutadi). Katta hajmda yoki tez-tez chaqirilsa, bu UI'ni muzlatib qo'yishi mumkin — chunki JS bitta thread (Single-thread model, eslang), sinxron operatsiya boshqa hech narsani ishlashiga yo'l qo'ymaydi.
3. sessionStorage — localStoragening "vaqtinchalik" versiyasi
sessionStorage.setItem('formStep', '2');
API jihatidan localStorage bilan bir xil (setItem, getItem, removeItem, string-only, sinxron). Yagona farq — umr davomiyligi: sessionStorage — faqat shu tab (vkladka) ochiq turgan davrda yashaydi. Tab yopilsa — ma'lumot yo'qoladi. Yangi tab ochsangiz (hatto bir xil sahifa bo'lsa ham) — bo'sh boshlanadi, oldingi tab bilan umuman bo'lishilmaydi.
Amaliy misol: ko'p bosqichli forma to'ldirilayotganda, foydalanuvchi tasodifan sahifani yangilab yuborsa — sessionStoragedagi progressni tiklash mumkin, lekin tab yopilsa (masalan, forma tugagach) — avtomatik tozalanadi, keyingi safar "eskisi qolib ketmaydi".
4. IndexedDB — brauzerdagi haqiqiy ma'lumotlar bazasi
Yuqoridagi uchtasi — oddiy kalit-qiymat (key-value) saqlash. Agar sizga katta hajmda strukturaviy ma'lumot (masalan, minglab yozuv, indekslash, qidiruv) kerak bo'lsa — IndexedDB ishlatiladi.
const request = indexedDB.open('MyDatabase', 1);
request.onupgradeneeded = (event) => {
const db = event.target.result;
db.createObjectStore('users', { keyPath: 'id' });
};
request.onsuccess = (event) => {
const db = event.target.result;
const tx = db.transaction('users', 'readwrite');
tx.objectStore('users').add({ id: 1, name: 'Ali' });
};
Xususiyatlari:
- Hajmi — yuzlab MB, hatto GB gacha (brauzer va diskdagi bo'sh joyga bog'liq)
- Asinxron API — barcha operatsiyalar event-asosli (yoki Promisega o'ralgan holda,
IDBRequestorqali), Call Stack'ni bloklamaydi — chunki oldingi mavzuda ko'rgan Web API mexanizmi orqali ishlaydi: brauzer operatsiyani orqa fonda (fayl tizimi darajasida) bajaradi, tugagach natijani Event Loop orqali qaytaradi - Obyektlarni to'g'ridan-to'g'ri saqlaydi —
JSON.stringifyshart emas, murakkab JS obyektlarni (hattoBlob,File) saqlash mumkin - Indekslash va qidiruv qo'llab-quvvatlaydi — oddiy key → value'dan farqli, "ma'lum shart bo'yicha qidirish" imkoniyati bor (haqiqiy ma'lumotlar bazasiga o'xshab)
IndexedDB — offline-first ilovalar (masalan, Gmail'ning offline rejimi, PWA'lar) uchun asosiy vosita, chunki u katta hajmdagi ma'lumotni UI'ni bloklamasdan saqlay oladi.
5. Brauzer darajasida — bularning barchasi qayerda saqlanadi
Bularning barchasi — V8 heap'ida emas! Bu — muhim tushuncha: V8 — faqat JS kodni bajaradi, u xotirani boshqaradi, lekin doimiy saqlash (persistent storage) — bu butunlay boshqa qatlam, brauzerning profil papkasi ichida, disk faylida:
~/.config/google-chrome/Default/
├── Cookies (SQLite fayl)
├── Local Storage/
│ └── leveldb/ (Chrome localStorage uchun LevelDB formatidan foydalanadi)
└── IndexedDB/
└── https_example.com_0.indexeddb.leveldb/
Ya'ni localStorage.setItem() chaqirilganda, real jarayon:
- JS engine (V8) —
setItemchaqiruvini qabul qiladi - Bu — DOM API kabi, Blinkka uzatiladi (V8'ning o'zi buni bajarmaydi, xuddi
document.querySelectorkabi) - Blink — ma'lumotni origin (domen) bo'yicha ajratilgan joyga, diskdagi LevelDB fayliga yozadi
- Har bir origin (protokol + domen + port) — o'zining alohida storage fazosiga ega —
https://a.comninglocalStorage'ihttps://b.comga umuman ko'rinmaydi (Same-Origin Policy, xavfsizlik uchun asosiy chegara)
Qaysi birini qachon ishlatish — xulosa jadvali
| Hajmi | Umri | Serverga yuboriladimi | API turi | Ishlatilishi | |
|---|---|---|---|---|---|
| Cookie | ~4KB | Belgilangan muddat | Ha, har so'rovda | Sinxron | Login sessiya, server bilan bog'liq holat |
| localStorage | ~5-10MB | Umrbod | Yo'q | Sinxron | Sozlamalar, tema, kesh (kichik hajm) |
| sessionStorage | ~5-10MB | Tab yopilguncha | Yo'q | Sinxron | Vaqtinchalik forma holati, tab-maxsus ma'lumot |
| IndexedDB | Yuzlab MB+ | Umrbod | Yo'q | Asinxron | Katta hajmdagi struktura, offline ilovalar |
Storage API'lar — V8 heap'idan tashqarida, brauzer diskida, origin bo'yicha izolyatsiya qilingan holda ma'lumot saqlaydi; tanlov — hajm, umr davomiyligi va server bilan bog'liqlik ehtiyojiga qarab qilinadi, kichik/oddiy holatlar uchun localStorage/sessionStorage, katta/murakkab holatlar uchun IndexedDB.