前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >前端存储除了 localStorage 还有啥

前端存储除了 localStorage 还有啥

原创
作者头像
阿宝哥
修改于 2020-06-18 02:18:12
修改于 2020-06-18 02:18:12
2.5K00
代码可运行
举报
文章被收录于专栏:全栈修仙之路全栈修仙之路
运行总次数:0
代码可运行

❝ 本文介绍一些与前端数据存储有关,「有趣、好玩、有用」的开源库。除此之外,还会让你掌握各种 Web 存储方案的特点,赶紧来了解一下。 ❞

前端的数据存储方式,你除了用过 Cookies、localStorage 和 sessionStorage 外,还有用过其它的存储方式么?其实除了前面提到的 3 种存储方式,目前主流的浏览器还支持 Web SQL 和 IndexedDB。

目前市场上主流的浏览器有 Chrome 、Safari、Firefox、Opera、UC Browser 和 Internet Explorer 等,其中截止 2020 年 5 月,Chrome 的市场占有率为 「63.93%」,远远超过第二名 Safari 浏览(「18.19%」)。

(图片来源:https://gs.statcounter.com/)

这里我们以市场占有率第一的 Chrome 浏览器为例,来了解一下它支持的所有存储方案:

(打开 Chrome 开发者工具,切换至 Application 栏位)

在介绍目前比较流行的一些开源的前端存储方案之前,阿宝哥先分享一些与存储有关,有趣好玩的开源库。

一、有趣好玩的开源库

1.1 Sharedb

❝ Realtime database backend based on Operational Transformation (OT)。 https://github.com/share/sharedb ❞

ShareDB 是一个基于 JSON 文档操作转换(OT)的实时数据库后端。它是 DerbyJS Web 应用程序框架的实时后端。

「示例1:实时数据同步

「示例2:展示实时查询的排行榜应用程序」

1.2 ImmortalDB

❝ 🔩 A relentless key-value store for the browser。 https://github.com/gruns/ImmortalDB ❞

ImmortalDB 是在浏览器中存储持久键值数据的最佳方法。保存到 ImmortalDB 的数据被冗余地存储在 Cookies,IndexedDB 和 localStorage 中,并且如果其中的任何数据被删除或损坏,它们将不断进行自我修复。

例如,清除 Cookie 是一种常见的用户操作,即使对于非技术用户也是如此。在存储压力下,浏览器在没有警告的情况下随意删除 IndexedDB、localStorage 或 sessionStorage。

「示例」

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { ImmortalDB } from 'immortal-db'

await ImmortalDB.set('name', 'semlinker'); // Set
await ImmortalDB.get('name', default='lolo'); // Get
await ImmortalDB.remove('name'); // Remove 
1.3 web-storage-cache

❝ 对 localStorage 和 sessionStorage 进行了扩展,添加了超时时间,序列化方法。 https://github.com/wuchangming/web-storage-cache ❞

WebStorageCacheHTML5 localStorage 和 sessionStorage 进行了扩展,「添加了超时时间,序列化方法」。可以直接存储 JSON 对象,同时可以非常简单的进行超时时间的设置。

❝ 优化:WebStorageCache 自动清除访问的过期数据,避免了过期数据的累积。另外也提供了清除全部过期数据的方法:wsCache.deleteAllExpires(); ❞

「示例」

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var wsCache = new WebStorageCache();

// 缓存字符串'wqteam' 到 'username' 中, 超时时间100秒
wsCache.set('username', 'wqteam', {exp : 100});

// 超时截止日期,可用使用Date类型
var nextYear = new Date();
nextYear.setFullYear(nextYear.getFullYear() + 1);
wsCache.set('username', 'wqteam', {exp : nextYear});

// 获取缓存中 'username' 的值
wsCache.get('username');

// 缓存简单js对象,默认使用序列化方法为JSON.stringify。
// 可以通过初始化wsCache的时候配置serializer.serialize
wsCache.set('user', { name: 'Wu', organization: 'wqteam'});
1.4 lz-string

❝ LZ-based compression algorithm for JavaScript。 https://github.com/pieroxy/lz-string/ ❞

lz-string 旨在满足在 localStorage 中(尤其是在移动设备上)存储大量数据的需求。 localStorage 通常限制为 5MB ~10MB,你可以通过对数据进行压缩,以存储更多的数据。

「示例」

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var string = "Hello, my name is semlinker";
console.log("Size of sample is: " + string.length);

var compressed = LZString.compress(string);
console.log("Size of compressed sample is: " + compressed.length);

string = LZString.decompress(compressed);
console.log("Sample is: " + string);

下图是使用官方在线示例进行字符串压缩测试的结果:

(图片来源:https://pieroxy.net/blog/pages/lz-string/demo.html)

接下来我们开始来介绍一些主流的数据库。

二、主流的数据库

2.1 localForage

❝ 💾 Offline storage, improved. Wraps IndexedDB, WebSQL, or localStorage using a simple but powerful API. https://github.com/localForage/localForage ❞

localForage 是一个快速简单的 JavaScript 存储库。 它通过使用类似于 localStorage 的简单 API 来使用异步存储(IndexedDB 或 WebSQL),进而改善你的 Web 应用程序的离线体验。

对于不支持 IndexedDB 或 WebSQL 的浏览器,localForage 会使用 localStorage 进行数据存储。此外,localForage 还支持存储所有可以序列化为 JSON 的原生 JS 对象以及 ArrayBuffers,Blob 和 TypedArrays。

localForage 主要支持的平台:

  • IE 10(IE 8+ 使用 localStorage)
  • Opera 15(Opera 10.5+ 使用 localStorage)
  • Firefox 18
  • Safari 3.1(包括 Mobile Safari)
  • Chrome 23、Chrome for Android 32
  • Phonegap/Apache Cordova 1.2.0
2.2 PouchDB

❝ 🐨 - PouchDB is a pocket-sized database. https://github.com/pouchdb/pouchdb ❞

PouchDB 是一个浏览器内数据库,允许应用程序在本地保存数据,以便用户即使在离线时也可以享受应用程序的所有功能。另外,数据在客户端之间是同步的,因此用户可以随时随地保持最新状态。

PouchDB 也在 Node.js 中运行,可以用作与 「CouchDB」 兼容的服务器的直接接口。该 API 在每个环境中工作都是相同的,因此你可以花更少的时间来担心浏览器的差异,而花更多的时间来编写干净、一致的代码。

PouchDB 支持所有现代浏览器:

  • Firefox 29+ (Including Firefox OS and Firefox for Android)
  • Chrome 30+
  • Safari 5+
  • Internet Explorer 10+
  • Opera 21+
  • Android 4.0+
  • iOS 7.1+
  • Windows Phone 8+

PouchDB 在幕后使用 IndexedDB,若当前环境不支持 IndexedDB 则回退到 Web SQL。

2.3 Rxdb

❝ 💻 🔄 📱 A realtime Database for JavaScript Applications. https://github.com/pubkey/rxdb ❞

RxDB(Reactive Database 的缩写)是 NoSQL 数据库,用于 JavaScript 应用程序,如网站,混合应用程序,Electron Apps,Progressive Web Apps 和 Node.js。响应式意味着你不仅可以查询当前状态,还可以订阅所有状态更改,比如查询的结果或文档的单个字段。

这对于基于 UI 的实时应用程序非常有用,因为它易于开发,并且具有很大的性能优势。为了在客户端和服务器之间复制数据,RxDB 提供了用于与任何 CouchDB 兼容端点以及自定义 GraphQL 端点进行实时复制的模块。

RxDB 支持以下特性:

  • Mango-Query:支持 mquery API 从集合中获取数据,支持链式的 mongoDB 查询风格。
  • Replication:因为 RxDB 依赖于 PouchDB,因此很容易实现终端设备与服务器之间的数据同步。
  • Reactive:RxDB 使得同步 DOM 的状态变得很简单。
  • MultiWindow/Tab:当 RxDB 的两个实例使用相同的存储引擎,它们的状态和操作流将会被广播。这意味着对于两个浏览器窗口,窗口 #1 的数据变化也会自动影响窗口 #2 的数据状态。
  • Schema:通过 jsonschema 来定义 Schemas,它们用来描述数据格式。
  • Encryption:通过将模式字段设置为encrypted,该字段的值将以加密模式存储,没有密码就无法读取。
2.4 NeDB

❝ The JavaScript Database, for Node.js, nw.js, electron and the browser. https://github.com/louischatriot/nedb ❞

NeDB 是一个 JavaScript 数据库,能够运行在 Node.js、nw.js、Electron 和浏览器环境。它是使用纯的 JavaScript 实现,不依赖其它库,提供的 API 是 MongoDB API 的子集,重要的是它的速度非常快:

  • 插入:10,680 ops/s
  • 查找:43,290 ops/s
  • 更新:8,000 ops/s。
  • 删除:11,750 ops/s。

ops (operation per second) 即表示每秒操作的次数。

2.5 Dexie.js

❝ A Minimalistic Wrapper for IndexedDB. https://github.com/dfahlander/Dexie.js ❞

Dexie.js 是 IndexedDB 的包装库,它提供了一套经过精心设计的 API,强大的错误处理,较强的可扩展性,此外它能够跟踪数据变化,支持 KeyRange (搜索不区分大小写,可设置匹方式和 OR 操作)。

Dexie.js 主要为了解决原生 IndexedDB API 中存在的三个主要问题:

  • 异常错误处理。
  • 较弱的查询功能。
  • 代码复杂性。

为了便于开发者接入 Dexie.js,在 Dexie.js 官网中提供了丰富的示例:

  • React + Dexie
  • React + Redux + Dexie
  • Dexie with Typescript
  • Angular + Dexie
  • Dexie with Electron
  • Full Text Search

以上只列出部分示例,了解更多示例请访问:Dexie.js - Samples(https://dexie.org/docs/Samples)。最后我们来简单介绍一下各种 Web 存储方案。

三、各种 Web 存储方案简介

3.1 Cookie

HTTP Cookie(也叫 Web Cookie 或浏览器 Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。

Cookie 主要用于以下三个方面:

  • 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息);
  • 个性化设置(如用户自定义设置、主题等);
  • 浏览器行为跟踪(如跟踪分析用户行为等)。

Cookie 的特点:

  • Cookie 的大小受限,一般为 4 KB;
  • 同一个域名下存放 Cookie 的个数是有限制的,不同浏览器的个数不一样,一般为 20 个;
  • Cookie 支持设置过期时间,当过期时自动销毁;
  • 每次发起同域下的 HTTP 请求时,都会携带当前域名下的 Cookie;
  • 支持设置为 HttpOnly,防止 Cookie 被客户端的 JavaScript 访问。

「示例1:简单用法」

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
document.cookie = "name=semlinker";
document.cookie = "favorite_food=tripe";

alert(document.cookie);
// 显示: name=semlinker;favorite_food=tripe

「示例2:得到名为 test2 的 cookie」

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
document.cookie = "test1=Hello";
document.cookie = "test2=World";

var myCookie = document.cookie
    .replace(/(?:(?:^|.*;\s*)test2\s*\=\s*([^;]*).*$)|^.*$/, "$1");
alert(myCookie);
3.2 localStorage

一种持久化的存储方式,也就是说如果不手动清除,数据就永远不会过期。它是采用键值对的方式存储数据,按域名将数据分别保存到对应数据库文件里。相比 Cookie 来说,它能保存更大的数据。

localStorage 的特点:

  • 大小限制为 5MB ~10MB;
  • 在同源的所有标签页和窗口之间共享数据;
  • 数据仅保存在客户端,不与服务器进行通信;
  • 数据持久存在且不会过期,重启浏览器后仍然存在;
  • 对数据的操作是同步的。

「示例」

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 通过setItem()增加一个数据项
localStorage.setItem('myName', 'Semlinker');

// 通过getItem()获取某个数据项
let me = localStorage.getItem('myName');

// 通过removeItem()移除某个数据项
localStorage.removeItem('myName');

// 移除所有数据项
localStorage.clear();
3.3 sessionStorage

与服务端的 session 类似,sessionStorage 是一种会话级别的缓存,关闭浏览器时数据会被清除。需要注意的是 sessionStorage 的作用域是窗口级别的,也就是说不同窗口之间保存的 sessionStorage 数据是不能共享的。

sessionStorage 的特点:

  • sessionStorage 的数据只存在于当前浏览器的标签页;
  • 数据在页面刷新后依然存在,但在关闭浏览器标签页之后数据就会被清除;
  • 与 localStorage 拥有统一的 API 接口;
  • 对数据的操作是同步的。

「示例」

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 通过setItem()增加一个数据项
sessionStorage.setItem('myName', 'Semlinker');

// 通过getItem()获取某个数据项
let me = sessionStorage.getItem('myName');

// 通过removeItem()移除某个数据项
sessionStorage.removeItem('myName');

// 移除所有数据项
sessionStorage.clear();
3.4 Web SQL

Web SQL 数据库 API 实际上不是 HTML5 规范的一部分,而是一个单独的规范,它引入了一组 API 来使用 SQL 来操作客户端数据库。需要注意的是,HTML5 已经放弃 Web SQL 数据库。

Web SQL Database 规范中定义的三个核心方法:

  • openDatabase:这个方法使用现有数据库或新建数据库来创建数据库对象;
  • transaction:这个方法允许我们根据情况控制事务的提交或回滚;
  • executeSql:这个方法用于执行真实的 SQL 语句。

Web SQL 的特点(相比 Cookie、localStorage 与 sessionStorage):

  • Web SQL 能方便进行对象存储
  • Web SQL 支持事务,能方便地进行数据查询和数据处理操作。

「示例」

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);

db.transaction(function (tx) { 
   // 执行查询操作
   tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique, log)'); 
   // 执行插入操作
   tx.executeSql('INSERT INTO LOGS (id, log) VALUES (1, "foobar")'); 
   tx.executeSql('INSERT INTO LOGS (id, log) VALUES (2, "logmsg")'); 
}); 
3.5 IndexedDB

IndexedDB 是一种底层 API,用于客户端存储大量结构化数据,包括文件、二进制大型对象。该 API 使用索引来实现对该数据的高性能搜索。虽然 Web Storage 对于存储较少量的数据很有用,但对于存储更大量的结构化数据来说,这种方法不太好用。IndexedDB 提供了一个解决方案。

IndexedDB 的特点:

  • 存储空间大:存储空间可以达到几百兆甚至更多;
  • 支持二进制存储:它不仅可以存储字符串,而且还可以存储二进制数据;
  • IndexedDB 有同源限制,每一个数据库只能在自身域名下能访问,不能跨域名访问;
  • 支持事务型:IndexedDB 执行的操作会按照事务来分组的,在一个事务中,要么所有的操作都成功,要么所有的操作都失败;
  • 键值对存储:IndexedDB 内部采用对象仓库(object store)存放数据。所有类型的数据都可以直接存入,包括 JavaScript 对象。对象仓库中,数据以 “键值对” 的形式保存,每一个数据记录都有对应的主键,主键是独一无二的,不能有重复,否则会抛出一个错误。
  • 数据操作是异步的:使用 IndexedDB 执行的操作是异步执行的,以免阻塞应用程序。

「示例」

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var dbName = "my_db";

var request = indexedDB.open(dbName, 2);

request.onerror = function(event) {
  // 错误处理
};

request.onupgradeneeded = function(event) {
  var db = event.target.result;

  // 建立一个对象仓库来存储我们客户的相关信息,我们选择 ssn 作为键路径(key path)
  // 因为 ssn 可以保证是不重复的
  var objectStore = db.createObjectStore("customers", { keyPath: "ssn" });

  // 建立一个索引来通过姓名来搜索客户。名字可能会重复,所以我们不能使用 unique 索引
  objectStore.createIndex("name", "name", { unique: false });

  // 使用邮箱建立索引,我们确保客户的邮箱不会重复,所以我们使用 unique 索引
  objectStore.createIndex("email", "email", { unique: true });

  // 使用事务的 oncomplete 事件确保在插入数据前对象仓库已经创建完毕
  objectStore.transaction.oncomplete = function(event) {
    // 将数据保存到新创建的对象仓库
    var customerObjectStore = db.transaction("customers", "readwrite").objectStore("customers");
    customerData.forEach(function(customer) {
      customerObjectStore.add(customer);
    });
  };
};

篇幅有限这里我们只介绍了部分开源库,其实还有一些其它成熟的开源库,比如 lowdb(Local JSON Database)、Lovefield(Relational Database)和 LokiJS(NoSQL Database)等,如果你知道其它好玩的项目,欢迎给阿宝哥留言哟。

四、参考资源

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
除了缓存,浏览器还有哪些存储数据的方式?
浏览器提供3种用于数据存储的 JavaScript APIs:cookie 、Web Storage API、IndexedDB。
Learn-anything.cn
2021/12/27
1.6K0
上传图片后如何不依赖后端回显?你可能需要indexedDB存储技术
大家好,我是前端队长Daotin,想要获取更多前端精彩内容,关注我,解锁前端成长新姿势。
Daotin
2021/11/10
2.1K0
超越 Cookie:当今的浏览器端数据存储方案[每日前端夜话0xA3]
当 cookie 被首次引入时,它是浏览器保存数据的唯一方式。之后又有了很多新的选择:Web Storage API、IndexedDB 和 Cache API。那么 cookie 死了吗?我们来看看这些在浏览器中存储数据的技术。
疯狂的技术宅
2019/08/06
1.3K0
超越 Cookie:当今的浏览器端数据存储方案[每日前端夜话0xA3]
LocalStorage不够用?那就该试试这个
随着浏览器的功能不断增强,越来越多的网站开始考虑将大量的数据存储在客户端,相比后端接口,获取数据更快一些。但摆在我们眼前的现状是这样的:
程序员老鱼
2023/11/16
3850
LocalStorage不够用?那就该试试这个
前端存储技术
后端常用数据库做数据存储,譬如MySql、MongoDB,缓存技术存储数据,如Redis、Memcached;
Jack Chen
2019/02/25
1.9K0
前端存储技术
详解浏览器存储
随着移动网络的发展与演化,我们手机上现在除了有原生 App,还能跑“WebApp”——它即开即用,用完即走。一个优秀的 WebApp 甚至可以拥有和原生 App 媲美的功能和体验。WebApp 优异的性能表现,有一部分原因要归功于浏览器存储技术的提升。cookie存储数据的功能已经很难满足开发所需,逐渐被Web Storage、IndexedDB所取代,本文将介绍这几种存储方式的差异和优缺点。
浪里行舟
2022/05/13
1.2K0
详解浏览器存储
用NW.js构建跨平台桌面应用(4)-数据持久化
https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API
江米小枣
2020/06/15
2.1K0
【Vuejs】总结- Vue 存储插件的底层原理,你不知道的 localStorage API
当谈到 Web 应用的客户端存储时,localStorage API 脱颖而出,它允许开发者直接在浏览器中存储键值对。
pingan8787
2024/05/30
2570
【Vuejs】总结- Vue 存储插件的底层原理,你不知道的 localStorage API
浏览器之客户端存储
大家好,我是柒八九。我们在网络拾遗之Http缓存文章中,从网络协议的视角介绍了网站「客户端缓存」 中的HTTP缓存策略,并对「强缓存」和「协商缓存」做了较为详细的介绍。
前端柒八九
2022/08/25
2.4K0
浏览器之客户端存储
HTML5离线应用与客户端存储
支持离线 Web 应用开发是 HTML5 的另一个重点。所谓离线 Web 应用,就是在设备不能上网的情况下仍然可以运行的应用。
laixiangran
2018/07/25
3.9K0
浏览器里的本地数据库:IndexedDB
在现代浏览器的本地存储方案中,indexedDB 是一项重要的能力组成, 它是可以在浏览器端使用的本地数据库,可以存储大量数据,提供接口来查询,还可以建立索引,这些都是其他存储方案 Cookie 或者 LocalStorage 无法提供的能力。单从数据库类型来看,IndexedDB 是一个非关系型数据库(不支持通过 SQL 语句操作)。
政采云前端团队
2019/12/19
1.4K0
浏览器相关--H5本地存储
浏览器存储主要包括一下几个部分 1. cookie 2. localStorage 3. sessionStorage 4. indexDB 5. websql 6. window变量 7. flash cookie
木子墨
2018/09/13
8600
浏览器本地存储方案
浏览器本地存储方案可以分为三个方面,分别为Cookie、Web Storage、IndexedDB。
WindRunnerMax
2021/01/18
7140
HTML5 学习总结(三)——本地存储(localStorage、sessionStorage、WebSqlDataBase、IndexedDB)
HTML5问世以后,前端加入了一个重要的功能,便是本地存储,本地存储可分为4类: Local Storage:总的存储量有所限制,并不能提供真正的检索API,数据的生命期比窗口或浏览器的生命期长,数据
张果
2018/01/03
7.7K0
HTML5 学习总结(三)——本地存储(localStorage、sessionStorage、WebSqlDataBase、IndexedDB)
萌新必看——10种客户端存储哪家强,一文读尽!
数据持久指将内存中的数据模型转化为存储模型,和将存储模型转化为内存中的数据模型这一过程的统称。在普通情况下,我们存储的数据会一直保留,直到我们删除相关内容;或者是这些数据保存到浏览器会话结束,用户关闭之后。 但在实际情况中会更加复杂一些。用户、操作系统、浏览器或插件都可以随时阻止或删除持久数据。浏览器有权限删除存储内容比较陈旧或者是比较大的项目内容;还能记录页面状态,当我们离开当前页面,重新打开页面的时候上次记录的内容会得到保存记录,可以直接使用。
葡萄城控件
2021/06/11
2.9K0
萌新必看——10种客户端存储哪家强,一文读尽!
HTML5本地存储:从入门到精通
💡 概念: HTML5本地存储是一种允许Web应用程序在用户浏览器端本地保存数据的技术,无需依赖服务器。它增强了Web应用的离线功能、个性化设置保留以及性能优化。
空白诗
2024/06/14
1820
localStorage和sessionStorage本地存储
使用HTML5中的Web Storage API, 可以在客户端存储更多的数据,,可以实现数据在多个页面中共享甚至是同步,对于复杂的数据,可以使用 Web SQL Database API 来实现。
达达前端
2021/02/04
2.1K0
HTML5五种客户端离线存储方案
HT for Web
2018/01/03
3.2K0
HTML5五种客户端离线存储方案
深入浅出前端本地储存
文章在后面还会提出一个全新的,基于 IndexedDB 的,更适合现代前端应用的前端本地储存方案 GoDB.js
@超人
2021/03/18
8450
深入浅出前端本地储存
很全很全的前端本地存储讲解
cookie 前言 网络早期最大的问题之一是如何管理状态。简而言之,服务器无法知道两个请求是否来自同一个浏览器。当时最简单的方法是在请求时,在页面中插入一些参数,并在下一个请求中传回参数。 这需要使用包含参数的隐藏的表单,或者作为URL参数的一部分传递。这两个解决方案都手动操作,容易出错。cookie出现来解决这个问题。 作用 cookie是纯文本,没有可执行代码。存储数据,当用户访问了某个网站(网页)的时候,我们就可以通过cookie来向访问者电脑上存储数据,或者某些网站为了辨别用户身份、进行sessio
企鹅号小编
2018/02/07
1.3K0
推荐阅读
相关推荐
除了缓存,浏览器还有哪些存储数据的方式?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验