本文作者:IMWeb 江源 原文出处:IMWeb社区 未经同意,禁止转载
本地存储(localStorage)已经不是新鲜的概念,本文并不是本地存储的概念及 API 介绍,而是对本地存储在实际业务场景中的一些问题做些探讨,从而形成一套规范,保证本地存储在提高页面性能、提升用户体验的同时,避免出现莫名其妙的错误。
本文试图回答如下问题:
让人意外的是,这一点在各主流浏览器(包含PC、移动端)竟然惊人的一致,都是 5M 的数量级。 值得说明的是,安卓上手 Q 、手机QQ浏览器、微信中则是 2.5M 的数量级,因此在移动端,本地存储的 SIZE 更加珍贵。IOS 待测试。 综上,SIZE 在 2 - 5M 的区间。 测试页面: Web Storage Support Test
QUOTA_EXCEEDED_ERR
。客户端的存储空间宝贵,然而站点也因为业务的不同,很难有一个统一的实施细则,但是有几个大原则不会变。
http://request-ajax.cgi[params]
),这样必然让 key 值趋于冗余从而撑爆空间以上几大原则仅作参考,一切从实际业务出发。
目前来说,localStorage 只能做为提升用户体验的手段,而不能成为客户端逻辑的可靠的、唯一的依赖,毕竟用户环境千差万别。 当不使用通用 local 库的情况下,务必作如下检查:
if (window.localStorage) {
try {
localStorage.setItem('bla', 'bla');
} catch (e) {
if (e.name === 'QUOTA_EXCEEDED_ERR' || e.name === 'NS_ERROR_DOM_QUOTA_REACHED') {
// todo
} else {
// todo
}
}
}
这个在上面的“原则”里面也有说,key 值应该整站统一约束。先整理如下规则,待讨论。
JSON.stringify
,性能问题,移动端尤其明显- value 尽量使用 string // before function store(key, val) { localStorage.setItem(key, JSON.stringify(val)); } store('num', 1); store('on', true); store('name', 'pamela'); // after function store(key, val) { localStorage.setItem(key, val); } store('num', '1'); store('on', 'true'); store('name', 'pamela');
- [jsperf: Primitives vs. Strings](http://jsperf.com/passing-strings-vs-primitive-in-localstorage)
- [jsperf: Optional use of JSON stringify](http://jsperf.com/json-stringify-or-string-for-localstorage)
// before
$('input[type="checkbox"]').click(function () {
localStorage.setItem($(this).attr('name'), $(this).is(':checked'));
});
// after
window.onunload = function () {
$('input[type="checkbox"]').each(function () {
localStorage.setItem($(this).attr('name'), $(this).is(':checked'));
});
};
尽量将数据缓存进内存,然后页面卸载的时候一次写入。
参看文章,Nicholas Zakas: Responsive Interfaces 。
按钮在点击过程中会有 UI 变化,这个时候同步操作 local 就会阻塞 UI 。
// before
$('button').click(function () {
var name = localStorage.getItem('name');
$('#name').html(name);
});
// after
$('button').click(function () {
window.setTimeout(function () {
var name = localStorage.getItem('name');
$('#name').html(name);
}, 10);
});
- [autoStorage](https://github.com/phunkei/autoStorage)
- [Savify](https://github.com/blackcoat/Savify)