[译]本地存储的概述

在浏览器内直接存储数据有很多好处,最主要的是快以及独立于网络去访问“数据库”,目前有四种方法(加上一个弃用),将数据存储在客户端:

  1. Cookies
  2. Local Storage
  3. Session Storage
  4. IndexedDB
  5. WebSQL (弃用)

Cookies

Cookies 是经典的存储数据方式,把简单的字符串数据储存在一个文档里。通常情况下,Cookies从服务器被发送到客户机,然后储存,并在后续请求中发送回服务器。这可以用于管理账户和跟踪用户信息。

另外,Cookies可以完全在客户端存储数据,正因为如此,它们也被用于存储通用数据如用户偏好。

Cookies实现基本的CRUD

我们可以创建、读取、更新和删除cookie使用以下语法:

// Create
document.cookie = "user_name=Ire Aderinokun";  
document.cookie = "user_age=25;max-age=31536000;secure";

// Read (All)
console.log( document.cookie );

// Update
document.cookie = "user_age=24;max-age=31536000;secure"; 

// Delete
document.cookie = "user_name=Ire Aderinokun;expires=Thu, 01 Jan 1970 00:00:01 GMT";  

Cookies的优点

  • 可以用于与服务器通信
  • 可以设置自动到期,而不必手动删除

Cookies的缺点

  • Cookie数量和长度有限制
  • 只能储存字符串
  • 潜在的安全问题
  • 自从网络存储API问世以来,它不再是客户端存储所推荐的方法

Support

在所有主要浏览器基本都支持

Local Storage

Local StorageWeb Storage API中的一种,是一种将键值数据存储在浏览器中的API。它通过提供一个更加直观和安全API来存储简单的数据在浏览器内,解决了Cookies中的问题。

尽管技术上我们只能将字符串存储在本地存储,但这可以存储字符串化的JSON。跟Cookies比,这使我们能将更复杂的数据存储在本地。

Local Storage实现基本的CRUD

我们可以创建、读取、更新和删除cookie使用以下语法:

// Create
const user = { name: 'Ire Aderinokun', age: 25 }  
localStorage.setItem('user', JSON.stringify(user));

// Read (Single)
console.log( JSON.parse(localStorage.getItem('user')) ) 

// Update
const updatedUser = { name: 'Ire Aderinokun', age: 24 }  
localStorage.setItem('user', JSON.stringify(updatedUser));

// Delete
localStorage.removeItem('user');  

Local Storage 的优点

  • 提供了一个更简单直观的界面来存储数据(跟cookie比)
  • 本地存储更安全(跟cookie比)
  • 允许存储更多的数据(跟cookie比)

Local Storage 的缺点

  • 只允许存储字符串

Support

img

Session Storage

Session Storage是第二种类型的网络存储API。和Local Storage很相似,不同之处在于 Local Storage 里面存储的数据没有过期时间设置,而存储在 Session Storage 里面的数据在页面会话结束时会被清除。

Session Storage实现基本的CRUD

我们可以创建、读取、更新和删除cookie使用以下语法:

// Create
const user = { name: 'Ire Aderinokun', age: 25 }  
sessionStorage.setItem('user', JSON.stringify(user));

// Read (Single)
console.log( JSON.parse(sessionStorage.getItem('user')) ) 

// Update
const updatedUser = { name: 'Ire Aderinokun', age: 24 }  
sessionStorage.setItem('user', JSON.stringify(updatedUser));

// Delete
sessionStorage.removeItem('user');  

Session Storage优缺点以及Support

Local Storage一样

IndexedDB

IndexedDB是一个对浏览器存储数据来说更加复杂但更加全面的解决方案。IndexedDB 是“一个为了能够在客户端存储可观数量的结构化数据,并且在这些数据上使用索引进行高性能检索的 API”(Mozilla)。这是一个基于javascript、面向对象、数据库使我们方便地存储和检索数据

Ire Aderinokun的文章中,详细的说了如何使用IndexedDB创建一个离线应用程序。

IndexedDB实现基本的CRUD

跟其他浏览器存储方法比起来,使用IndexedDB更为复杂的。在我们可以创建/读取/更新/删除任何数据之前,我们需要首先打开数据库,创建一个放数据的仓库。

function OpenIDB() {  
    return idb.open('SampleDB', 1, function(upgradeDb) {
        const users = upgradeDb.createObjectStore('users', {
            keyPath: 'name'
        });
    });
}

创建(或更新)数据,我们需要经过以下步骤:

// 1. Open up the database
OpenIDB().then((db) => {  
    const dbStore = 'users';

    // 2. Open a new read/write transaction with the store within the database
    const transaction = db.transaction(dbStore, 'readwrite');
    const store = transaction.objectStore(dbStore);

    // 3. Add the data to the store
    store.put({
        name: 'Ire Aderinokun',
        age: 25
    });

    // 4. Complete the transaction
    return transaction.complete;
});

读取数据,我们需要经过以下步骤:

// 1. Open up the database
OpenIDB().then((db) => {  
    const dbStore = 'users';

    // 2. Open a new read-only transaction with the store within the database
    const transaction = db.transaction(dbStore);
    const store = transaction.objectStore(dbStore);

    // 3. Return the data
    return store.get('Ire Aderinokun');
}).then((item) => {
    console.log(item);
})

删除数据,我们需要经过以下步骤:

// 1. Open up the database
OpenIDB().then((db) => {  
    const dbStore = 'users';

    // 2. Open a new read/write transaction with the store within the database
    const transaction = db.transaction(dbStore, 'readwrite');
    const store = transaction.objectStore(dbStore);

    // 3. Delete the data corresponding to the passed key
    store.delete('Ire Aderinokun');

    // 4. Complete the transaction
    return transaction.complete;
})

IndexedDB的优点

  • 可以处理更复杂的、结构化的数据
  • 在每个“数据库”中,可以有多个“数据库”和“表”
  • 更多的存储空间
  • 控制我们如何与之交互

IndexedDB的缺点

跟其他Web Storage API比起来太过复杂

Support

img

WebSQL

自2010年以来,W3C Web应用程序规范工作组已经停止对其维护。它不再是一个HTML规范的一部分,不应使用。

比较

Feature Cookies Local Storage Session Storage IndexedDB
存储空间 ~4KB ~5MB ~5MB Up to half of hard drive
持久数据? Yes Yes No Yes
数据类型 String String String Any structured data
可检索? No No No Yes

原文

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容