同源:协议、域名、端口号 三者一样是同源 非同源(跨域):三者只要有一个不一样就是跨域 对于页面中不经常更新的数据,我们期望能够做一下缓存「缓存周期可以自己来定」
本地存储的解决方案:控制台->Application「可以看到本地存储的信息(明文存储->不安全)」
不论何种存储方案,存储到本地的信息,如果是一些比较因隐私的,最好不存储,存储也一定要加密
- cookie【常用】
- webstorage H5新增的 不兼容IE6~8
- localStorage【常用】
- sessionStorage【常用】
- IndexedDB 本地数据库存储
WebSQL
- …
1. cookie
document.cookie 【获取cookie】
document.cookie=’name=xxx’’ 设置cookie- 兼容所有浏览器 不仅包含IE6~8 还包含IE5
- cookie能存储的信息比较少:同源【协议 域名 端口号】下最多可存储4KB内容
- 如果过了4KB内容 他会把之前的挪出一部分
- 有的浏览器是不让存
- cookie是有过期时间 和 “域”的限制的「不能跨域访问」
- 跨域:如在京东下设置的cookie 在百度页面是获取不到的
- cookie存储的信息非常不稳定
- 浏览器的无痕浏览器或者隐私模式下是存储不上cookie的
- 而且基于浏览器清理工具或者一些杀毒软件,清理垃圾信息的时候,即使没过期的cookie也可能被清除掉
- cookie并不是单纯的本地存储,和服务器之间是有“猫腻”的:每一次向服务器发送请求,客户端都会在请求头中基于Cookies字段,把本地存储的cookie传递给服务器
…
2. localStorage
localStorage.setItem([key],[value])
localStorage.getItem([key])
localStorage.removeItem([key])
localStorage.clear()
…
不兼容IE6~8
- 同源下最多可存储5MB,比cookie存储的多很多
- 永久本地存储,没有过期时间「除非手动清除或者卸载浏览器」;也会受到跨域和跨浏览器的限制;
- localStorage的稳定性非常好,清除垃圾的时候对他没影响
localStorage和服务器没有半毛钱关系
3. sessionStroage
语法和特点与localStorage基本一致sessionStroage是会话存储,基于它设置的信息,只要页面不关闭(哪怕是F5刷新),信息都在,但是页面一关闭,存储的信息都清空了;localStorage是持久化存储,不论刷新还是关闭,信息都在!
4. 全局变量 & 公共状态管理(vuex/redux)
都是在开辟的堆栈内存中存储,页面只要刷新和关闭,信息就都没有了…
fetch
fetch('./data.json').then(response => {
// response中包含了服务器返回的信息:响应主体信息response.body「ReadableStream可读流信息」,我们需要把可读流信息变为指定的格式
// + Response.prototype.json/text/blob/arrayBuffer...
// + 执行这些方法中的任何一个,返回结果都是一个promise实例:如果可以把响应主体信息正常转换为指定的格式,则promise的状态是fulfilled、值是转换为的数据内容,如果不能正常转换,则状态是失败的...
// + 一但执行了其中的一个方法,再执行其他方法,会出问题
return response.json();
}).then(value => {
console.log(value);
});
// 直接这样处理,每一次打开页面或者刷新页面,当前请求都需要重新发送「哪怕获取的结果是一样的」;优化:对不不经常更新的数据,我们应该做一下本地存储(临时缓存);
(function () {
// 每一次打开/刷新页面,首先看本地是否有缓存,而且是否过期「假设过期时间1min」
let cache = localStorage.getItem('cache');
if (cache) {
cache = JSON.parse(cache);
if (new Date() - cache.time <= 60000) {
// 有缓存&没过期
console.log('从缓存中获取的:', cache.value);
return;
}
}
fetch('./data.json').then(response => {
return response.json();
}).then(value => {
console.log('从服务器获取的:', value);
// 获取结果后,我们需要把信息缓存到本地「存储到本地的是字符串」
localStorage.setItem('cache', JSON.stringify({
time: +new Date(),
value
}));
});
})();