各种前端存储方式间有什么区别?

1. 内存缓存

// 示例
const memoryCache = {
	data: new Map(),
	set(key,val){
		this.data.set(key,val);
	}
}
特性备注
存储位置RAM(运行时内存)
生命周期页面会话周期(刷新页面后清除)
容量限制受限于可用内存
访问速度最快(纳秒级)
数据持久化无(关闭页面即消失)

适用场景:

  • 频繁访问的中间计算结果(vue 的 computed 属性)
  • 当前会话的临时状态
  • 高频使用的配置数据

2. Service Worker

// sw.js
self.addEventListener('fetch', event => {
	event.respondWith(
		caches.match(event.request)
	)
})
特点
存储位置独立于网页的后台线程
生命周期独立于页面(可后台运行)
容量限制较大(几百 M)
访问速度快(可控制缓存策略)
数据持久化持久(直到手动清除)

适用场景:

  • PWA(渐进式 Web 应用)
  • 离线应用
  • 网络请求代理
  • 后台同步

3. Cache API

// 打开缓存
caches.open('v1').then(cache => {
	cache.add('/styles.css') //缓存紫苑
})
特点
存储位置浏览器专用缓存存储
生命周期Request/Response 对象
容量限制较大(几百 M)
访问速度快(异步)
数据持久化持久(可手动清除)

适用场景:

  • 静态资源缓存
  • API 响应缓存
  • 离线资源缓存

4. Storage API

// localStorage
localStorage.setItem("theme", "dark")
 
// sessionStorage
sessionStorage.setItem("temp", "data")
特点
存储位置硬盘(SQLite 数据库)
生命周期键值对(仅字符串)
容量限制5~10M
访问速度慢(同步阻塞)
数据持久化localStorage(永久)/sessionStorage(会话)

适用场景:

  • 用户偏好设置
  • 表单草稿
  • 简单的应用状态

5. IndexedDB

// 异步、支持索引
const req = indexedDB.open('myDB', 1)
特点
存储位置硬盘
生命周期任何结构化数据(对象、文件等)
容量限制很大(250M+)
访问速度慢(异步非阻塞)
数据持久化持久(可手动清除)

适用场景:

  • 大量结构化数据
  • 离线数据存储
  • 文件/Blob 存储
  • 复杂查询需求

多级缓存示例