一、本地存储方案概述
现代 Web 应用中常用的本地存储方案主要包括:
- Cookie
- Web Storage (localStorage / sessionStorage)
- IndexedDB
- Web SQL Database (已废弃)
- Cache API
- File System API
二、详细介绍
1. Cookie
1.1 基本概念
Cookie 是服务器发送到用户浏览器并保存在本地的一小块数据。它会在浏览器下次向同一服务器发起请求时被携带并发送到服务器上。
1.2 核心属性
Name
: Cookie 的名称Value
: Cookie 的值Domain
: 可以访问该 Cookie 的域名Path
: 可以访问该 Cookie 的页面路径Expires/Max-Age
: Cookie 的过期时间Size
: Cookie 的大小不能超过 4KBHttpOnly
: 设置了 HttpOnly 属性的 cookie 不能通过 JavaScript 访问Secure
: 只有在 HTTPS 协议下才能传输SameSite
: 防止 CSRF 攻击和用户追踪
1.3 使用示例
// 设置 Cookie
document.cookie ="username=John Doe; expires=Thu, 18 Dec 2023 12:00:00 UTC; path=/";// 获取 CookieconstgetCookie=(name)=>{const cookies = document.cookie.split(';');for(let cookie of cookies){const[cookieName, cookieValue]= cookie.split('=');if(cookieName.trim()=== name){returndecodeURIComponent(cookieValue);}}returnnull;};// 删除 Cookie
document.cookie ="username=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";
2. Web Storage
2.1 localStorage
特点:
- 持久化存储,数据永久保存
- 存储容量通常为 5-10MB
- 同源策略限制
- 仅支持字符串存储
// 存储对象
localStorage.setItem('user',JSON.stringify({name:'John', age:30}));// 获取对象const user =JSON.parse(localStorage.getItem('user'));// 监听存储变化
window.addEventListener('storage',(e)=>{
console.log('Storage changed:', e.key, e.newValue, e.oldValue);});
2.2 sessionStorage
特点:
- 会话级存储,关闭标签页即清除
- 容量与 localStorage 相同
- 同一个会话中的页面才能访问相同的数据
3. IndexedDB
3.1 特点
- 支持索引和事务
- 支持二进制存储
- 异步操作
- 支持版本控制
3.2 基本使用示例
// 打开数据库const request = indexedDB.open("MyDatabase",1);
request.onerror=(event)=>{
console.error("Database error: "+ event.target.error);};
request.onsuccess=(event)=>{const db = event.target.result;// 使用数据库};
request.onupgradeneeded=(event)=>{const db = event.target.result;const objectStore = db.createObjectStore("users",{ keyPath:"id"});
objectStore.createIndex("name","name",{ unique:false});};
三、存储方案对比
特性CookielocalStoragesessionStorageIndexedDB容量4KB5-10MB5-10MB>250MB有效期可设置永久会话期间永久作用域同源+路径同源同标签页同源通信每次请求发送不发送不发送不发送API易用性简单简单简单复杂数据类型字符串字符串字符串任意
四、常见面试题
1. localStorage 和 sessionStorage 的区别?
答:主要区别在于:
- 生命周期不同:localStorage 永久存储,sessionStorage 仅在会话期间有效
- 作用域不同:sessionStorage 仅在同一标签页中共享,localStorage 在同源的所有标签页共享
- 存储事件:localStorage 的修改会触发其他页面的 storage 事件,sessionStorage 不会
2. Cookie 和 Web Storage 的区别?
答:主要区别:
- 容量限制不同:Cookie 4KB,Web Storage 5-10MB
- 是否随请求发送:Cookie 会自动随请求发送,Web Storage 不会
- 操作方式:Cookie 操作相对复杂,Web Storage API 简单直观
- 数据访问:Cookie 可以服务器端设置,Web Storage 仅客户端可访问
3. 如何实现 localStorage 的过期功能?
答:可以封装一个带过期时间的存储方法:
const storage ={set(key, value, expires){const data ={
value,
expires: expires ?newDate().getTime()+ expires :null};
localStorage.setItem(key,JSON.stringify(data));},get(key){const data =JSON.parse(localStorage.getItem(key));if(data){if(data.expires && data.expires <newDate().getTime()){
localStorage.removeItem(key);returnnull;}return data.value;}returnnull;}};
4. 如何处理 localStorage 的容量超出问题?
答:可以采用以下策略:
- 实现 LRU 缓存淘汰算法
- 压缩数据后再存储
- 分片存储大数据
- 及时清理无用数据
// LRU 缓存示例classLRUStorage{constructor(limit =5){this.limit = limit;this.cache =newMap();}set(key, value){if(this.cache.size >=this.limit){const firstKey =this.cache.keys().next().value;this.cache.delete(firstKey);}this.cache.delete(key);this.cache.set(key, value);this.syncToStorage();}privatesyncToStorage(){
localStorage.setItem('cache',JSON.stringify([...this.cache]));}}
五、最佳实践建议
- 根据数据特性选择合适的存储方式:- 用户标识、认证信息:Cookie- 临时数据:sessionStorage- 应用配置、主题设置:localStorage- 大量结构化数据:IndexedDB
- 安全性考虑:- 敏感数据加密存储- 设置 Cookie 的 HttpOnly 和 Secure 属性- 定期清理过期数据
- 性能优化:- 避免存储过大数据- 合理使用序列化和反序列化- 批量操作时使用事务
写在最后
感谢您花时间阅读这篇文章! 🙏
如果您觉得文章对您有帮助,欢迎:
- 关注我的技术博客:徐白知识星球 📚
- 关注微信公众号:徐白知识星球
我会持续输出高质量的前端技术文章,分享实战经验和技术心得。
共同成长
- 欢迎在评论区留言交流
- 有问题随时后台私信
- 定期举办技术分享会
- 更多精彩内容持续更新中…
让我们一起在技术的道路上携手前行! 💪
版权归原作者 徐白1177 所有, 如有侵权,请联系我们删除。