前端开发中最常用的5种本地存储方式总结

 更新时间:2026年03月05日 08:30:00   作者:半世轮回半世寻  
在前端开发中,本地存储用于在浏览器中持久化或临时存储数据,这篇文章主要介绍了前端开发中最常用的5种本地存储方式,文中通过代码介绍的非常详细,需要的朋友可以参考下

最近项目里又在反复纠结本地数据怎么存最合适,就想把前端日常最常碰的几种存储方式捋一遍。

为什么前端需要本地存储?

简单说:提升性能、支持离线、记住用户偏好、减少服务器压力。

比如列表页用户翻了好几页,下次进来还想看到上次位置和筛选;PWA没网也能看点内容;主题暗黑模式、字体大小这些小东西,不想每次请求接口。

服务器传太慢,内存关页就丢,本地存储就成了日常标配。

优秀的前端本地存储该有哪些特性?(参考后端思路,我觉得前端也差不多)

  • 容量够用(别5MB就爆)
  • 持久性(关浏览器还能剩多少)
  • 性能(读写快不快,同步/异步)
  • 易用性(API友好不)
  • 跨标签共享(多标签能不能同步)
  • 结构化支持(对象、数组、Blob、大文件行不行)
  • 安全性(同源、隐私模式)

基于这些,2026年现在前端项目里,我最常用来存的其实就这5种(从简单到复杂排):

1. localStorage

最基础、最常用,几乎每个项目都逃不开。

怎么用(大家都知道,但还是贴代码):

// 存
localStorage.setItem('userTheme', 'dark');

// 取
const theme = localStorage.getItem('userTheme');

// 删
localStorage.removeItem('userTheme');

// 清空
localStorage.clear();

容量:一般5MB左右(Chrome、Safari、Firefox差不多)

持久性:永久,除非用户手动清浏览器缓存。

优缺点

  • 优点:API极简,同步操作,跨标签共享(改一个,其他标签能通过storage事件监听到)
  • 缺点:只能存字符串(对象要JSON.stringify),同步大点数据会卡主线程,隐私模式下可能被清,iOS Safari有时莫名其妙丢数据

真实场景:用户设置(主题、侧边栏状态)、token应急存、简单购物车草稿

2. sessionStorage

跟localStorage几乎一样,但会话级。

代码:把localStorage换成sessionStorage就行,用法一模一样。

容量:5MB左右

持久性:标签页关了就没了(同窗口新tab共享)

优缺点

  • 优点:临时数据不污染长期,安全性稍好(自动销毁)
  • 缺点:不能跨标签持久共享

3. IndexedDB

大容量、结构化数据的王者,PWA/离线必备,现在中大型项目越来越多往这儿搬。

基本用法(原生API啰嗦,实际我基本用dexie.js或idb封装,这里先贴原生):

// 打开数据库
const request = indexedDB.open('myAppDB', 1);

request.onupgradeneeded = (event) => {
  const db = event.target.result;
  db.createObjectStore('todos', { keyPath: 'id', autoIncrement: true });
};

request.onsuccess = (event) => {
  const db = event.target.result;
  // 操作...
};

// 存数据(事务)
function addTodo(todo) {
  const tx = db.transaction('todos', 'readwrite');
  const store = tx.objectStore('todos');
  store.add(todo);
}

容量:很大,通常几百MB到GB(视磁盘空间,浏览器配额管理,远超5MB)

持久性:永久,但空间紧张时浏览器可能清(比localStorage难清)

优缺点

  • 优点:异步不卡线程、支持复杂对象/Blob/文件、索引查询、事务
  • 缺点:原生API回调地狱,学习曲线陡(推荐封装)

4. Cache API(配合Service Worker)

资源缓存神器,PWA性能核心。

基本用法(必须在sw.js里):

// sw.js install事件
self.addEventListener('install', (event) => {
  event.waitUntil(
    caches.open('my-app-v1').then(cache => {
      return cache.addAll([
        '/styles.css',
        '/app.js',
        '/images/logo.png'
      ]);
    })
  );
});

// fetch拦截
self.addEventListener('fetch', (event) => {
  event.respondWith(
    caches.match(event.request).then(response => {
      return response || fetch(event.request);
    })
  );
});

容量:跟IndexedDB一样,受配额管理,很大

持久性:持久,但可被浏览器清理

优缺点

  • 优点:专为资源设计(html/css/js/img),拦截请求方便,支持离线秒开
  • 缺点:只能存Request/Response,不适合业务JSON;依赖Service Worker(https或localhost)

真实场景:PWA壳子、静态资源离线、图片懒加载备用、H5页面缓存

5. 内存缓存(JS对象/Map + 简单LRU)

页面内最快,临时数据首选。

简单实现(项目里常用mini LRU):

class SimpleLRU {
  constructor(max = 100) {
    this.max = max;
    this.cache = new Map();
  }
  get(key) {
    if (!this.cache.has(key)) return null;
    const value = this.cache.get(key);
    this.cache.delete(key);
    this.cache.set(key, value);
    return value;
  }
  set(key, value) {
    if (this.cache.has(key)) this.cache.delete(key);
    this.cache.set(key, value);
    if (this.cache.size > this.max) {
      const oldest = this.cache.keys().next().value;
      this.cache.delete(oldest);
    }
  }
}

// 用法
const pageCache = new SimpleLRU(50);
pageCache.set('userListPage1', data);

容量:内存大小,取决于JS堆

持久性:页面刷新/关闭就没了

优缺点

  • 优点:纳秒级、无序列化、最快
  • 缺点:不持久、内存泄漏风险

整体对比一图概览

维度localStoragesessionStorageIndexedDBCache API内存缓存
易用性★★★★★★★★★★★★☆☆☆★★★☆☆★★★★☆
容量★★☆☆☆ (5MB)★★☆☆☆★★★★★★★★★★★☆☆☆☆
持久性★★★★★★☆☆☆☆★★★★★★★★★☆★☆☆☆☆
性能★★★☆☆★★★☆☆★★★★☆★★★★★★★★★★
结构化支持★☆☆☆☆★☆☆☆☆★★★★★★★☆☆☆★★★★☆
适用规模小配置临时会话中大型离线资源/PWA页面内临时

最后选型建议(我自己的经验)

  • 简单配置、偏好 → localStorage
  • 临时表单/状态 → sessionStorage
  • 大量业务数据、离线 → IndexedDB(强烈推dexie.js)
  • PWA/静态资源 → Cache API + Service Worker
  • 页面内高速复用 → 内存LRU

项目里我现在基本这么分层:小配置local,临时session,大数据IndexedDB,资源Cache,内存加速。

覆盖了95%的场景,不会再纠结了。

总结

到此这篇关于前端开发中最常用的5种本地存储方式的文章就介绍到这了,更多相关前端本地存储方式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • javascript canvas API内容整理

    javascript canvas API内容整理

    在本篇文章里小编给大家分享的是关于javascript canvas API内容整理,有需要的朋友们可以跟着学习参考下。
    2020-02-02
  • js最全的数组的降维5种办法(小结)

    js最全的数组的降维5种办法(小结)

    这篇文章主要介绍了js最全的数组的降维5种办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • JS实现数组去重方法总结(六种方法)

    JS实现数组去重方法总结(六种方法)

    这篇文章给大家总结下JS实现数组去重方法(六种方法),面试中也经常会遇到这个问题。文中给大家引申的还有合并数组并去重的方法,感兴趣的朋友跟随脚本之家小编一起学习吧
    2017-07-07
  • 微信小程序中做用户登录与登录态维护的实现详解

    微信小程序中做用户登录与登录态维护的实现详解

    微信小程序的运行环境不是在浏览器下运行的。所以不能以cookie来维护登录态。下面这篇文章主要给大家介绍了微信小程序中如何做用户登录与登录态维护的相关资料,文中介绍的非常详细,需要的朋友可以参考学习。
    2017-05-05
  • Javascript 修改String 对象 增加去除空格功能(示例代码)

    Javascript 修改String 对象 增加去除空格功能(示例代码)

    这篇文章主要介绍了Javascript 修改String 对象 增加去除空格功能(示例代码)。需要的朋友可以过来参考下,希望对大家有所帮助
    2013-11-11
  • js对象数组按属性快速排序

    js对象数组按属性快速排序

    前一篇《关于selector性能比赛》中提到,目测觉得在$("div,p,a")这样有逗号时,sizzle耗时异常(600多个元素,花了200ms),说是它可能没有优化ie下的排序。
    2011-01-01
  • JavaScript拆分字符串时产生空字符的解决方案

    JavaScript拆分字符串时产生空字符的解决方案

    使用JavaScript的split方法拆分字符串时出现一些空字符串"",尤其是当使用正则表达式作为分隔符的时候。那么,产生这些空字符串的原因是什么?又该如何来处理呢,这就是今天我们要探讨的问题
    2014-09-09
  • JS实现数组扁平化的方法分享

    JS实现数组扁平化的方法分享

    数组扁平化指的是:将一个多层嵌套的数组,处理成只有一层的数组。本文主要和大家介绍了几个常用的JS数组扁平化方法,希望对大家有所帮助
    2023-04-04
  • Bootstrap table列上下移动效果

    Bootstrap table列上下移动效果

    这篇文章主要为大家详细介绍了Bootstrap table列上下移动效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • JavaScript设计模式之缓存代理模式原理与简单用法示例

    JavaScript设计模式之缓存代理模式原理与简单用法示例

    这篇文章主要介绍了JavaScript设计模式之缓存代理模式原理与简单用法,结合实例形式简要分析了javascript缓存代理模式的基本原理、使用方法及相关操作注意事项,需要的朋友可以参考下
    2018-08-08

最新评论