5月27日 22:34
Chrome 浏览器有哪些存储机制?
核心答案
Chrome 提供四种主流存储机制,按容量从小到大排列:
| 存储方式 | 容量 | 生命周期 | 操作方式 | 是否随请求发送 |
|---|---|---|---|---|
| Cookie | ~4KB | 可设过期时间 | 同步 | 是 |
| SessionStorage | ~5MB | 标签页关闭即清 | 同步 | 否 |
| LocalStorage | ~5MB | 永久(手动清除) | 同步 | 否 |
| IndexedDB | 可用磁盘50% | 永久 | 异步 | 否 |
Cookie:最小但最忙
Cookie 每次请求自动携带到服务端,适合认证和会话管理。容量仅 4KB,可通过 HttpOnly 防 XSS、Secure 限 HTTPS、SameSite 防 CSRF。
jsdocument.cookie = 'token=abc; HttpOnly; Secure; SameSite=Strict; max-age=3600';
SessionStorage 与 LocalStorage:同源下的两种策略
两者都只能存字符串,API 一致:
jslocalStorage.setItem('theme', 'dark'); const theme = localStorage.getItem('theme'); // 'dark'
关键区别:SessionStorage 标签页隔离,关闭即消失,不同标签页不共享;LocalStorage 同源共享,跨标签页可读写,持久存在。
IndexedDB:大数据场景的选择
IndexedDB 是浏览器内置的事务型数据库,支持索引和游标查询,适合离线应用和大量结构化数据。
jsconst req = indexedDB.open('myDB', 1); req.onupgradeneeded = e => { const db = e.target.result; db.createObjectStore('users', { keyPath: 'id' }); }; req.onsuccess = e => { const db = e.target.result; const tx = db.transaction('users', 'readwrite'); tx.objectStore('users').add({ id: 1, name: 'Tom' }); };
异步 API 不阻塞主线程,可在 Web Worker 中使用——这是 localStorage 做不到的。
追问:Storage 存满会怎样?
写入操作静默失败(不抛异常),可提前用 navigator.storage.estimate() 查询已用和可用空间。
追问:如何给 localStorage 加过期时间?
localStorage 本身不支持,需要手动封装:存储时附带时间戳,读取时校验是否过期并清除。
jsfunction setWithExpiry(key, value, ttl) { const item = { value, expiry: Date.now() + ttl }; localStorage.setItem(key, JSON.stringify(item)); } function getWithExpiry(key) { const raw = localStorage.getItem(key); if (!raw) return null; const item = JSON.parse(raw); if (Date.now() > item.expiry) { localStorage.removeItem(key); return null; } return item.value; }
实际项目中推荐用 localstorage-ttl 这类成熟库,别重复造轮子。