使用Web Storage API

其实这是很简单的一个API。但这个API也存在不少问题可以深究一下。

说到这个API,我就想起曾经一次面试:当时面试我的CTO拿出自己的iPhone6,打开一个网址,说这个页面在其他所有的手机都没问题,偏偏就是我的手机无法访问。我一瞧,果然一片空白,然后我敏锐地发现他的浏览器开启了隐私模式,我马上就猜到这是隐私模式下设置Storage的问题。和CTO扯了一些关于Storage API的知识后,关掉隐私模式果然没问题。

MDN

要探究Web API,首先就想到MDN。因为平常习惯了中文阅读,所以也自然而然地打开中文语言。然而我脑袋一转,觉得这么简单的API阅读英文应该也是比较简单的吧,而且还可以顺便对比一下中英文版本练练自己的翻译。然而这个偶然的动作让我发现了英语阅读是多么地重要!

中英文版本的差异

中文版本漏翻译了许多部分(有些还是很重要的),我觉得这估计是选择性翻译导致的问题。

比如:

  • 我们可以像访问对象一样来访问Storage
localStorage.colorSetting = '#a4509b';
localStorage['colorSetting'] = '#a4509b';
localStorage.setItem('colorSetting', '#a4509b');

但是,不推荐这样使用,因为会有可能读取到Storage原型链上的属性,还有一些可能会遇到的“陷阱”,有一篇相关的阅读可以看一下《The pitfalls of using objects as maps in JavaScript》。译者忽略这段内容,估计是觉得既然不推荐这样使用,就干脆不告诉你了。虽然这部分内容对使用这个API没什么帮助,但是它关联到了一些重要的其他JavaScript知识。

  • 可用性检测。这个是很重要的一点,和我前面提到的那个故事有着密切的联系。因为在使用storage API的时候,我们需要检测一下当前环境这个API是否可用,如果不可用还继续使用的话,用户代理(一般就指浏览器)会抛出异常。如果是SPA(single page application)的话就会出现我前面那个故事一样的结果——白屏。而且MDN还提供了一个可用性检测的函数,不过这里我要推荐的是另一个写法:
function storageAvailable() {
    try {
        const mod = '__storage__test__'
        localStorage.setItem(mod, mod);
        localStorage.removeItem(mod);
        return true;
    } catch(e) {
        return false;
    }
}

附上一个Storage可用性检测函数的简要历史

基本概念

Web Storage提供了两种机制让我们实现离线存储:

  • localStorage
  • sessionStorage

其中,sessionStorage会存储数据,直到浏览器关闭才销毁数据。而localStorage则是持久式存储。

另外需要注意的是,两种机制都是在每个独立域名分开独立存储数据的。也就是浏览器的同源策略(相同协议;相同域名;相同端口)

意思就是,在a.com下无法访问到b.com的storage数据,当然这是基于安全性的考虑。

跨域

跨域是前端开发(面试)常遇到的问题。说到这个本人就好苦恼了,因为实际开发遇到的跨域问题,受到各种(后端)限制,通常简单地使用Access-Control-Allow-origin解决。因此跨域的问题真心没什么总结和心得,只能强行看人家的心得,来再次吸收与总结了。

由于同源策略的限制,相同主域名,不同子域名的页面的storage都不能互相访问,因此要实现跨域访问的话,就必须采用其他的办法,比如HTML5提出的postMessage方法:

首先设置一个控制中心hub,负责写入/读取/删除 storage。其他要相互交互的域名就都通过iframe引入这个hub,通过postMessage和hub交互,达到读写storage的目的。参考annn.me的流程图如下:

github上已有一个比较完备的类库可以参考:cross-storage

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

推荐阅读更多精彩内容

  • https://aws.amazon.com/cn/s3/faqs/#sia_anchor Amazon Simp...
    守望者_1065阅读 8,174评论 0 5
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • 本文介绍本地数据存储的选型。简单总结一些查询到的关于本地数据存储的技术。 控制台展示前端存储 Chrome: 前端...
    谢大见阅读 9,022评论 1 8
  • 本博客转自:「作者:若愚链接:https://zhuanlan.zhihu.com/p/22361337来源:知乎...
    韩宝亿阅读 2,726评论 0 3
  • 友情 是漂洋过海的那张明信片 只要一触摸它 便油然升温 友情 是吊脚群楼的那层叠灯火 只要一想起它 便微微颤亮 友...
    月亭阅读 394评论 6 3