笔记:浏览器——缓存与储存

HTTP缓存

Ctrl+F5强制刷新页面,缓存机制均无效,不允许使用任何缓存。
F5刷新页面,跳过强缓存机制,协商缓正常使用。

强缓存

  1. 强缓存校验
    ①浏览器发起GET请求前,检查本地是否有缓存,若无缓存直接发起GET请求,得到响应后,判断是否需要缓存。
    ②如果浏览器本地有缓存,则检查强缓存资源是否过期。没有过期则直接跳过GET请求,使用缓存资源。
    ③如果强缓存资源过期,则转为协商缓存校验。
  2. 强缓存分为disk cache和memory cache
    在浏览器开发者工具Network中可以看到
    在这里插入图片描述
  3. 强缓存的控制
    Expires是HTTP1.0中的字段,优先级最低。字段属性是一个时间戳,超过这个时间戳缓存过期。
    Cache-Control是HTTP1.1的字段。字段属性:
    no-store:禁止使用缓存,每次请求都去服务端拿最新的资源
    no-cache:不使用强缓存,直接进入协商缓存
    private:私有缓存,中间代理服务端不可缓存资源
    public:公共缓存,中间代理服务端可以缓存资源
    max-age:缓存的最长有效时间,单位是秒
    must-revalidate:缓存一旦过期,则必须重新向服务端验证
    Pragma是HTTP1.0的字段。只有一个no-cache属性与Cache-Control相同,但优先级大于Cache-Control

协商缓存

  1. 协商缓存校验
    ①强缓存校验过期后转为协商缓存校验,则会判断该资源上一响应头中是否有ETag,若存在则携带If-None-Match请求头发起请求。如果返回304则更新缓存头部信息,使用缓存资源。若返回200则重新缓存资源。
    ②若不存在ETag,则判断该资源上一响应头中是否有Last-Modified,若存在则携带If- Modified-Since请求头发起请求。如果返回304则更新缓存头部信息,使用缓存资源。若返回200则重新缓存资源。
    ③若都不存在则直接发起GET请求,得到响应后,判断是否需要缓存。
  2. 协商缓存的控制
    ETag / If-None-Match:优先级较高,用哈希值表示资源是否变化。
    Last-Modified / If- Modified-Since:比较修改时间和请求时间表示资源是否变化。存在1秒问题,当文件在1秒内修改,且再次收到请求时会错误返回304

Service Worker

CDN缓存

①Content Delivery Network内容分发网络,将网站的内容发布到最接近用户的网络边缘的节点,作为一层缓存,使用户可以就近取得所需的内容,提高用户访问网站的响应速度。
缓存控制
①CDN节点缓存静态资源遵循HTTP缓存。动态资源不进行缓存,请求回源并返回给客户端。
Vary是HTTP1.1的字段。其属性是请求头中的字段,记录了代理服务器向客户端返回资源时,参考了哪些头字段。代理服务器拿到源服务器的响应报文,根据Vary中的字段列表,缓存不同版本的资源。当有客户端请求资源时,会分析Vary中的字段,返回正确版本的资源。

Web Storage

Cookie

①浏览器Cookie的储存大小约为4K,且有个数限制,只能储存字符串类型数据。每次浏览器发送请求时会自动携带Cookie
Cookie有过期时间,删除一个Cookie只需将过期时间设置为-1即可。
③通过JS设置Cookiedomain都会默认以.开头的。
④删除Cookie需要domain属性与path属性一致才可删除。当domain属性为document.domain时,设置domain为空字符串即可删除。

// 获取Cookie
function getCookie(name){
    const cookies = {};
    const arr = document.cookie.split('; ');
    arr.forEach(item => {
        const [key, value] = item.split('=');
        cookies[key] = value;
    })
    return cookies[name];
}
// 设置Cookie
function setCookie(name, value, expires, domain='', path='/') {
    const d = new Date();
    d.setTime(d.getTime() + expires);
    const exp = d.toUTCString();
    document.cookie = `${name}=${value};expires=${exp};path=${path};domain=${domain};`;
}
// 删除Cookie
function removeCookie(name) {  
    setCookie(name, "", -1);  
}

LocalStorage

①浏览器localStorage在浏览器关闭后仍然永久储存数据,只能手动清除。
②储存的键值对必须是字符串类型,可用JSON.stringify()方法转换。
③读取键值是字符串类型,可用JSON.parse()方法转换。读取一个不存在的键名时,返回null

localStorage.setItem('key', JSON.stringify(value));
JSON.parse(localStorage.getItem('key'));
localStorage.removeItem('key');
localStorage.clear();

SessionStorage

①浏览器sessionStorage在浏览器关闭后丢失数据,在会话期间保持数据。
②每个页面的sessionStorage都独立不共享,即使是打开了多个相同页面。

sessionStorage.setItem('key', JSON.stringify(value));
JSON.parse(sessionStorage.getItem('key'));
sessionStorage.removeItem('key');
sessionStorage.clear();

IndexDB

前端优化

模块内容模块内容
HTTP1. 减少前端HTTP请求。
2. 浏览器缓存相同的JS、CSS、图片。
3. 页面GZIP压缩。
4. 减小Cookie的大小。
HTML1. 减少<iframe>,<tabel>(容易引起回流)的使用。
2. 减少DOM结构的层级。
CSS1. CSS引入标签放页面顶部。
2. 使用CSS Sprites(雪碧图)。
3. 尽量使用类名选择器。
4. 动画元素开启定位或浮动,脱离文档流
JavaScript1. JS脚本放页面底部。
2. 修改样式时,可以先把DOM克隆或隐藏,离线修改,再展示。
3. 节流和防抖
4. 不要一条一条的修改DOM样式,而是修改className或者修改style.cssText
其他1. 图片懒加载、预加载、图片base64。
2. 组件按需加载。
3. 虚拟滚动列表

图片懒加载

①图片的加载是由src引起的,使用HTML5的自定义属性data-src属性来储存真实图片的路径,将src储存为正在加载图片。在需要加载图片的时候,将data-src中的值赋值给src,这样就实现了图片的按需加载,即懒加载。
②懒加载图片的条件:元素顶部距离文档顶部的高度 < 浏览器滚动的过的距离 + 浏览器视口的高度。

虚拟列表

滚动懒加载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
KMP算法是一种字符串匹配算法,用于在一个文本串S内查找一个模式串P的出现位置。它的时间复杂度为O(n+m),其中n为文本串的长度,m为模式串的长度。 KMP算法的核心思想是利用已知信息来避免不必要的字符比较。具体来说,它维护一个next数组,其中next[i]表示当第i个字符匹配失败时,下一次匹配应该从模式串的第next[i]个字符开始。 我们可以通过一个简单的例子来理解KMP算法的思想。假设文本串为S="ababababca",模式串为P="abababca",我们想要在S中查找P的出现位置。 首先,我们可以将P的每个前缀和后缀进行比较,得到next数组: | i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | | --- | - | - | - | - | - | - | - | - | | P | a | b | a | b | a | b | c | a | | next| 0 | 0 | 1 | 2 | 3 | 4 | 0 | 1 | 接下来,我们从S的第一个字符开始匹配P。当S的第七个字符和P的第七个字符匹配失败时,我们可以利用next[6]=4,将P向右移动4个字符,使得P的第五个字符与S的第七个字符对齐。此时,我们可以发现P的前五个字符和S的前五个字符已经匹配成功了。因此,我们可以继续从S的第六个字符开始匹配P。 当S的第十个字符和P的第八个字符匹配失败时,我们可以利用next[7]=1,将P向右移动一个字符,使得P的第一个字符和S的第十个字符对齐。此时,我们可以发现P的前一个字符和S的第十个字符已经匹配成功了。因此,我们可以继续从S的第十一个字符开始匹配P。 最终,我们可以发现P出现在S的第二个位置。 下面是KMP算法的C++代码实现:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我才是真的李成贤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值