当前位置: 首页 > news >正文

​浏览器存储

🧠 一、常见的浏览器存储方式有哪些?

浏览器提供了几种主要的存储机制,适用于不同的场景:

存储方式说明容量生命周期作用域是否同步适合场景
LocalStorage持久化的本地键值存储~5~10MB永久(除非手动删除)同源(协议+域名+端口)✅ 同步用户偏好、主题、记住登录状态等
SessionStorage会话级别的键值存储~5~10MB标签页关闭后失效当前标签页(同源)✅ 同步单页会话数据,如表单草稿、临时筛选条件
IndexedDB浏览器中的非关系型数据库较大(几百MB甚至更多)永久或手动清除同源❌ 异步大量结构化数据、离线缓存、复杂查询
Cookies小型键值数据,随 HTTP 请求发送4KB 左右可设置过期时间可跨会话 / 跨域(视 Domain 设置)✅ 同步身份验证(如 Session ID)、跟踪、CORS 相关
Cache API用于缓存网络请求和响应较大永久或手动管理同源❌ 异步Service Worker 离线缓存、资源缓存
Web SQL(已废弃)​基于 SQLite 的数据库 API(不推荐)----已淘汰,不建议使用

✅ ​推荐重点掌握:LocalStorage、SessionStorage、IndexedDB、Cookies


💾 二、各种存储方式详解及使用


1. 📦 LocalStorage(本地存储)

特点:​

  • 永久存储(除非用户手动清除或代码删除)
  • 存储简单的键值对(字符串)
  • 同源下所有标签页共享
  • 容量:约 5~10MB

基本用法:​​ 

// 存数据(必须字符串)
localStorage.setItem('username', 'Alice');// 取数据
const user = localStorage.getItem('username'); // 'Alice'// 删除某个数据
localStorage.removeItem('username');// 清空所有 localStorage
localStorage.clear();

存储对象(需 JSON 序列化):​​ 

const user = { name: 'Bob', age: 25 };
localStorage.setItem('user', JSON.stringify(user));// 读取
const storedUser = JSON.parse(localStorage.getItem('user'));
console.log(storedUser.name); // Bob

适用场景:​

  • 用户主题设置(深色/浅色模式)
  • 用户偏好(语言、通知开关)
  • 记住我(简单 token 或标识)
  • 缓存少量静态数据

2. 🧳 SessionStorage(会话存储)

特点:​

  • 仅在当前浏览器标签页有效
  • 标签页关闭后数据自动清除
  • 不能跨标签页共享
  • 其他方面和 LocalStorage 几乎一样

基本用法:​​ 

sessionStorage.setItem('tempData', '12345');
const data = sessionStorage.getItem('tempData');
sessionStorage.removeItem('tempData');

适用场景:​

  • 表单填写中途的临时保存
  • 单页应用(SPA)内的临时状态
  • 不需要长期保存的会话数据

3. 🗃️ IndexedDB(索引数据库)

特点:​

  • 浏览器内置的非关系型数据库(NoSQL)
  • 支持存储大量结构化数据(比如数组、对象、文件等)
  • 异步操作(推荐使用 async/await 或 Promise)
  • 适合复杂查询、离线数据、大量缓存

基本特点:​

  • 容量:一般几十 MB 到几百 MB,甚至更多(视浏览器和硬盘空间而定)
  • 不适合直接操作,推荐使用封装库,如:
    • Dexie.js(简单易用,强烈推荐!)
    • localForage(简化异步存储,自动降级到 IndexedDB / WebSQL / localStorage)

使用 Dexie.js 的简单示例:​​ 

npm install dexie

 

// db.js
import Dexie from 'dexie';const db = new Dexie('MyVideoDB');db.version(1).stores({videos: '++id, title, url, watched'
});export default db;
// 使用
import db from './db';// 添加视频
await db.videos.add({ title: '视频1', url: 'http://example.com/1.mp4', watched: false });// 查询所有视频
const allVideos = await db.videos.toArray();
console.log(allVideos);

适用场景:​

  • 离线 Web 应用(PWA)
  • 大量本地数据(如笔记、收藏、历史记录)
  • 需要查询、排序、分页等操作的复杂数据

4. 🍪 Cookies(小甜饼)

特点:​

  • 存储少量数据(通常不超过 4KB)
  • 可设置过期时间(会话 Cookie / 持久 Cookie)
  • 每次 HTTP 请求都会自动携带(用于身份验证等)
  • 可以设置作用域(Domain / Path)
  • 通常用于身份验证、用户跟踪

基本用法(原生 JS):​​ 

// 设置 cookie(简单方式,不推荐用于生产)
document.cookie = "username=John; expires=Thu, 18 Dec 2025 12:00:00 UTC; path=/";// 读取(需自己解析)
console.log(document.cookie); // "username=John; otherKey=value..."// 删除 cookie(设置过期时间为过去)
document.cookie = "username=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";

推荐使用库来操作 Cookie,比如:​

  • js-cookie 
npm install js-cookie

 

import Cookies from 'js-cookie';// 设置
Cookies.set('token', 'abc123', { expires: 7 }); // 7天后过期// 读取
const token = Cookies.get('token');// 删除
Cookies.remove('token');

适用场景:​

  • 用户登录态(Token / Session ID)
  • 跨页面身份识别
  • 第三方跟踪与广告(谨慎使用!)

5. 📦 Cache API(缓存 API,常配合 Service Worker)

特点:​

  • 用来缓存网络请求和响应(如 HTML、JS、图片等)
  • 一般与 Service Worker 一起使用,实现 PWA 离线功能
  • 异步操作

简单示例:​​ 

// 打开一个缓存
caches.open('my-cache').then(cache => {// 添加请求和响应到缓存cache.addAll(['/index.html','/styles.css','/app.js']);
});

适用场景:​

  • 离线 Web 应用(PWA)
  • 加速重复访问(缓存静态资源)
  • 资源版本管理

🧩 三、如何选择合适的存储方式?

需求推荐存储方式
存储用户设置、主题、简单的键值数据✅ ​LocalStorage
临时会话数据,标签页级✅ ​SessionStorage
大量结构化数据,如收藏、历史记录、离线数据✅ ​IndexedDB​(或 Dexie.js)
身份验证 Token、小量跨请求数据✅ ​Cookies​(或 localStorage,但要考虑安全性)
离线缓存、资源缓存、Service Worker 配合✅ ​Cache API
不推荐:Web SQL(已废弃)

⚠️ 四、浏览器存储的注意事项

注意事项说明
同源策略只有相同 协议 + 域名 + 端口 的页面才能访问同一份存储
安全性不要存储敏感信息(如密码、token 明文)。如果使用 Cookie,设置 HttpOnlySecureSameSite 属性
隐私模式某些浏览器隐私模式下可能禁用或限制存储
容量限制LocalStorage 一般为 5~10MB,不要存过多数据
异步 vs 同步IndexedDB / Cache API 是异步的,LocalStorage / SessionStorage / Cookies 是同步的
SSR(服务端渲染)问题如 Next.js 中,​不要在服务端调用浏览器 API(如 localStorage)​,需要做 typeof window !== 'undefined' 判断

✅ 五、总结推荐

功能推荐技术
存储用户偏好 / 主题 / 设置LocalStorage
临时表单数据 / 页面级状态SessionStorage
大量本地数据(如收藏夹、离线内容)IndexedDB​(推荐使用 Dexie.js)
身份验证 / Token / 小数据跨请求Cookies​(推荐 js-cookie 库)
离线缓存 / 资源缓存 / PWACache API​ + ​Service Worker

🎁 六、额外建议

  • 不要滥用 LocalStorage 存敏感信息
  • 复杂对象要序列化(JSON.stringify)后才能存
  • 考虑封装统一的存储工具函数,便于维护
  • 对于大型应用,推荐使用状态管理(如 Redux、Zustand) + 持久化插件,结合 LocalStorage 实现状态持久化
http://www.xdnf.cn/news/1454851.html

相关文章:

  • 设计模式:中介者模式(Mediator Pattern)
  • 力扣190:颠倒二进制位
  • MySQL主从复制进阶(GTID复制,半同步复制)
  • SpringMVC —— 响应和请求处理
  • 手写 Tomcat
  • STM32启动模式配置
  • 一个开源的企业官网简介
  • RTSP H.265 与 RTMP H.265 的差异解析:标准、扩展与增强实现
  • 设备监控系统如何为重工业实现设备预测性维护
  • 【智谱清言-GLM-4.5】StackCube-v1 任务训练结果不稳定性的分析
  • uniapp中使用echarts并且支持pc端的拖动、拖拽和其他交互事件
  • 案例精述 | 防护即智能 Fortinet赋能英科全栈安全重构实践
  • [晕事]今天做了件晕事91,glibc,rand之前必须设置种子
  • AI+Java 守护你的钱袋子!金融领域的智能风控与极速交易
  • Elasticsearch面试精讲 Day 8:聚合分析与统计查询
  • docker更新jar包,懒人执行脚本
  • 若依微服务遇到的配置问题
  • 【数据可视化-108】2025年6月新能源汽车零售销量TOP10车企分析大屏(PyEcharts炫酷黑色主题可视化)
  • JUnit 详解
  • Rust+slint实现一个登录demo
  • 一文搞懂保险中的Nominee\Beneficiary\Trustee三个角色
  • Rustdesk搭建与客户端修改与编译
  • 从零开始的云计算生活——第五十八天,全力以赴,Jenkins部署
  • MD 格式说明
  • Web与Nginx网站服务
  • 2023 arXiv MapperGPT: Large Language Models for Linking and Mapping Entities
  • # 开发中使用——鸿蒙CoreSpeechKit让文字发声后续
  • 迈威通信从送快递角度教你分清网络二层和三层
  • 美团开源龙猫大模型,与DeepSeek V3同一梯队?
  • matlab实现希尔伯特变换(HHT)