下面给你一份 前端常见的数据缓存方案及其实现细节(超完整总结),涵盖浏览器端所有主流缓存方式,并给出优缺点、使用场景、代码示例与注意点。

内容结构:

  1. 前端缓存的核心分层
  2. 7 大常用缓存方案
  3. 各方案优缺点对比
  4. 常见的缓存架构最佳实践(含 Vue / React )

✅ 1. 前端缓存的核心分层

前端缓存可分为四大层:

层级技术描述
HTTP 缓存层Cache-Control / ETag浏览器自动缓存资源(HTML/CSS/JS/图片)
内存缓存JS 变量、Vue/React 状态管理页面刷新即消失,但最快
本地存储localStorage / sessionStorage简单的 key-value 存储
持久化缓存IndexedDB / CacheStorage存大量结构化数据、离线能力最强

✅ 2. 前端常见七大缓存方案

HTTP 缓存(强缓存 + 协商缓存)

浏览器原生机制,主要针对静态资源。

强缓存(直接返回缓存,不发请求)

  • Cache-Control: max-age=31536000
  • Expires: xxx

协商缓存(向服务端确认是否过期)

  • ETag / If-None-Match
  • Last-Modified / If-Modified-Since

✔ 优点:性能最佳,省流量
✘ 缺点:前端无法精准控制,只适用于静态文件


内存缓存(Memory Cache)

存储在内存,页面关闭后消失:

典型场景

  • Vue 中的 store(pinia/vuex)
  • React 中的 useState / useContext
  • 全局 JS 对象缓存

示例

const cache = {};

function getData() {
  if (cache.data) return Promise.resolve(cache.data);

  return fetch('/api/data').then(res => {
    cache.data = res;
    return res;
  });
}

✔ 优点:最快速、零 IO
✘ 缺点:刷新页面就没了


localStorage(永久保存)

localStorage.setItem("token", "123456");
localStorage.getItem("token");
localStorage.removeItem("token");

特点

  • 永久保存,除非用户手动清除
  • 大约 5MB 大小
  • 同步 API(会阻塞主线程)

✔ 用于持久数据:token、用户偏好设置
✘ 不适合存大量数据(同步阻塞)


sessionStorage(会话级别缓存)

sessionStorage.setItem("step", "2");

特点:

  • 标签页级别独立
  • 页面关闭即失效

✔ 适合:表单分步骤填写、临时状态保持
✘ 和 localStorage 一样是同步 API


Cookie(带自动附加功能)

前端:

document.cookie = "id=123; max-age=3600; path=/";

服务端响应头:

Set-Cookie: token=xxx; HttpOnly; Secure; SameSite=Lax

特点:

  • 会自动随请求发送到服务端
  • 有过期时间
  • 4KB 左右

✔ 最适合:sessionID、简单 token
✘ 不适合存大量数据


IndexedDB(浏览器数据库,适合大量数据)

适用场景:大数据结构化存储、离线应用。

示例(简化版)

const dbRequest = indexedDB.open("MyDB", 1);

dbRequest.onupgradeneeded = function() {
  const db = dbRequest.result;
  db.createObjectStore("users", { keyPath: "id" });
};

dbRequest.onsuccess = function() {
  const db = dbRequest.result;
  const tx = db.transaction("users", "readwrite");
  tx.objectStore("users").put({ id: 1, name: 'Tom' });
};

✔ 优点

  • 异步、性能好、不阻塞
  • 基本没有容量限制(GB 级别)
  • 适用于大型离线项目(如 PWA)

✘ 缺点

  • API 繁琐,需要封装

Cache API(PWA、Service Worker 离线缓存)

主要用于缓存请求响应,与 HTTP 缓存配合使用。

示例:缓存网络请求

caches.open("v1").then(cache => {
  cache.add("/api/user");
});

Service Worker 中使用:

self.addEventListener("fetch", event => {
  event.respondWith(
    caches.match(event.request).then(resp => resp || fetch(event.request))
  );
});

✔ 超强离线能力
✔ 可缓存整个网站
✘ 需要 Service Worker 配置


✅ 3. 各缓存方式对比(最实用表格)

缓存类型持久性容量是否阻塞是否随请求发送使用场景
Memory页面生命周期几 MB状态管理、页面变量
localStorage永久~5MB阻塞token、偏好设置
sessionStorage会话~5MB阻塞表单临时缓存
Cookie可设4KB少量阻塞✔ 会自动发送登录 session
IndexedDB永久数百 MB~GB异步大量数据、离线
Cache API永久异步PWA 离线缓存
HTTP Cache浏览器控制静态资源优化

✅ 4. 前端缓存最佳实践(实战方案)

🌟 方案 A:接口缓存(常用于 Vue/React)

async function fetchWithCache(key, url) {
  const cache = localStorage.getItem(key);
  if (cache) return JSON.parse(cache);

  const res = await fetch(url).then(r => r.json());
  localStorage.setItem(key, JSON.stringify(res));
  return res;
}


🌟 方案 B:Vue 项目中使用 “多级缓存架构”

推荐模式:内存 > localStorage > IndexedDB

流程:

用户访问 → 内存有? → localStorage 有? → IndexedDB 有? → 请求服务器


🌟 方案 C:React 项目中使用 SWR 或 React Query(自动缓存)

import useSWR from "swr";

const { data } = useSWR("/api/user", url => fetch(url).then(r => r.json()));

✔ 内存缓存
✔ 缓存过期
✔ 自动重试
✔ 失效刷新

这是前端最佳缓存方案之一。


🎯 总结(可复制)

前端缓存方案可分为 7 大类:

  1. HTTP 缓存(静态资源)
  2. Memory Cache(速度最快)
  3. localStorage(永久缓存)
  4. sessionStorage(会话级别)
  5. Cookie(随请求发送)
  6. IndexedDB(大量数据 + 离线)
  7. Cache API(PWA 级别离线)

项目建议使用 多级缓存体系,根据场景灵活搭配:

✔ 轻量数据 → localStorage
✔ 表单状态 → sessionStorage
✔ 登录状态 → Cookie / localStorage
✔ 大规模数据 → IndexedDB
✔ 离线应用 → Cache API