前端学习25 浏览器缓存(强缓存、协商缓存)和本地缓存

浏览器缓存是性能优化的一个非常重要的指标,而前端缓存也是我们在开发中必不可少的模块。

1.浏览器缓存

1.1 缓存流程

通常来说,浏览器首次加载资源会返回200,并且下载服务器文件,缓存资源及版本号,再次加载资源的时候就可根据资源请求头字段(强缓存&协商缓存)去判断是否使用缓存资源。HTTP Cache 是我们开发中接触最多的缓存,它分为强缓存和协商缓存。

  • 强缓存:直接从本地副本比对读取请求头,不去请求服务器,返回的状态码是200。
  • 协商缓存:会去服务器对比,若梅该百年才直接读取本地缓存,返回的状态码为304。

1.2 强缓存(expires\Cache-Control

强缓存就是像浏览器缓存中查找该请求内容,并根据该结果的缓存规则来决定是否适用该缓存结果的过程。强缓存是利用http的返回头中的 Expires 和 Cache-Control 两个字段来控制的,用来表示资源的缓存时间。

Expires:这是HTTP 1.0 的字段,表示缓存到期事件,是一个绝对时间(当前时间+缓存时间),当客户端和服务端时间不一致时,会存在问题。

Cache-Control:HTTP 1.1 新增字段,他是一个相对时间,主要是利用该字段的max-age值来进行判断,例如:Cache-Control:max-age=3600 ,表示着资源的有效期为3600秒。

Cache-Control几个常见的设置值:

  • no-cache:不使用本地缓存。需要使用缓存协商,咸鱼服务器确认返回的相应是否被更改,如果之前的相应中存在ETag,那么请求的时候会与服务端验证,如果资源未被修改,则可以避免重新下载。
  • no-store:直接禁止浏览器缓存数据,每次用户请求该资源,都会向服务器发送一个请求,每次都会下载完整的内容。
  • public:可以被所有的用户缓存,包括终端用户和CDN等中间代理服务器。
  • private:只能被终端用户的浏览器缓存,不允许CDN等中继缓存服务器对其缓存。
  • 优先级:cache-control -> expires

1.3 协商缓存((Last-Modified & If-Modified-Since\Etag & If-None-Match)

协商缓存就是强制缓存失效后,浏览器携带缓存标识向服务器发起请求,由服务器根据缓存标识决定是否使用缓存的过程。

协商缓存是发起http请求携带 Etag 或者 Last-Modified 两个字段,由服务器做对比确定缓存资源是否可用。

  • 服务器通过 Last-Modified 字段告知客户端,资源最后一次被修改的时间,客户端会自己对这个时间进行比对, 如果相等则表示未修改,响应 304;反之,则表示修改了,响应 200 状态码,并返回数据(如果资源更新的速度是秒以下单位,这个缓存就会失效,因为时间单位是秒)
  • Etag 存储的是文件的特殊标识(一般都是 hash 生成的),服务器存储着文件的 Etag 字段,之后的流程和 Last-Modified 一致
  • Last-Modified与ETag是可以一起使用的,服务器会优先验证ETag,一致的情况下,才会继续比对Last-Modified,最后才决定是否返回304。
  • 优先级: ETag -> Last-Modified

某些文件修改非常频繁,比如在秒以下的时间内进行修改,(比方说1s内修改了N次),if-modified-since能检查到的粒度是秒级的,这种修改无法判断(或者说UNIX记录MTIME只能精确到秒);

2.本地缓存

2.1 Cookie

  • 用于解决http无状态的缺点,在客户端存储会话信息,记录用户的状态
  • 使用cookie在客户端存储一些其它的数据,可以设置使用范围、增删改查作用
//增改:
Cookies.set("token", res1.data.result.token, {
	expires: 7,
	path: "/",
	domain: "101hr.com"
});
//删除对应项
Cookies.remove("token", { path: "/", domain: "101hr.com" });
//查
Cookies.get("menuClick")

2.2 sessionStorage、localStorage

  • 是一种在客户端存储数据的一种机制,主要的目的是为了克服由cookie带来的一些限制
  • 当数据需要被严格控制在客户端上时,无须将数据在客户端和服务器之间来回的进行传送,并且可以存储大量的跨会话的数据
  • Web Storage包含了两种对象的定义,sessionStorage和localStorage
  • sessionStorage只能存储字符串类型数据,无法直接存储数组类型和JSON对象
  • 所以可以JSON.stringify()方法转换成字符串,再存储到sessionstorage中,使用的时候再使用JSON.parse()转化回来

//sessionStorage和localStorage的使用方式是相近的
//增改
localStorage.setItem('redirect_uri',res.data.result.redirect_uri)
//存储数组和对象类型
localStorage.setItem('redirect_uri',JSON.stringify(res.data.result.redirect_uri))
sessionStorage.setItem('redirect_uri',res.data.result.redirect_uri) 
//查
localStorage.getItem('redirect_uri’)
JSON.parse(localStorage.getItem('redirect_uri’))
//删
localStorage.removeItem('redirect_uri’)
//清空storage数据
localStorage.clear() 

2.3 vuex

  • vuex是一个专为vue.js应用程序开发的状态管理器
  • 它采用集中式存储管理应用的所有组件的状态,并且以相 应的规则保证状态以一种可以预测的方式发生变化,采用单向数据流的方式更加快的定位到位置
  • 数据保存在Vuex的state字段内,任何页面组件都可以通过$store.state.变量名称去读取数据
  • 修改state数据,显示地提交mutations,使用this.$store.commit方法来执行mutations
  • 页面刷新数据恢复,故结合keep-alive、web Storage来使用

全部评论

相关推荐

05-18 07:43
已编辑
东华大学 前端工程师
一面(2025/02/13)1. 自我介绍2. 你如何学习前端的3. 为什么没有继续深入大数据相关行业4. 项目介绍    1. 项目功能    2. 如何处理学生考试时提交结果的高并发的问题    3. 为何选择 Pinia 而不是更加主流的 Vuex,出于什么考虑    4. 项目打包过程,产物是什么样的,浏览器能运行什么文件,能运行 ts 文件吗,为什么只有一个 index.html 却能显示不同页面,Vue 中的 template 代码是如何在浏览器中被看到的(这里一开始没有回答上来,所以在引导我)(单页应用 SPA)5. 工程化    1. Vite 打包过程    2. Webpack 与 Vite 的区别    3. Webpack 中的 loader 是做什么的    4. es6 转 es5 是怎么实现的,听说过 Babel 吗    5. npm、pnpm、yarn 的区别,lock 文件是做什么的6. Vue    1. 组合式 API 与选项式 API    2. Vue3 与 Vue2 的区别    3. 组件通信方式7. CSS    1. 有哪些布局,讲一讲 Flex 布局,常用属性    2. 定位方式    3. 选择器优先级,important 的优先级是多少8. JS    1. 实现异步的方式(回调、Promise、async/await)    2. Promise 的 API,Promise 的参数是什么    3. 事件循环,JS 引擎为什么是单线程    4. 浏览器缓存(强缓存、协商缓存)9. Git    1. 常用命令    2. rebase 与 merge 的区别10. Linux 常用命令11. 数据结构与算法    1. 数组和链表    2. 有哪些排序算法,冒泡排序与快速排序的时间复杂度    3. 图的表示方式    4. DFS 和 BFS,层序遍历属于哪个12. 反问:什么是大前端如何学习前端的回答没有让面试官满意;项目细节不太了解,没有去尝试理解更深层次的部分;对前端打包细节了解不多;基础知识仍然需要再完善提高。美团的面试官让我对面试有了新的认知,跟京东的面试体验差距好大。二面(2025/02/20)1. 面试官自我介绍,自我介绍2. 能实习多久,什么时候能来3. 你熟悉的技术栈4. 盒模型5. 居中方式6. 事件循环7. 防抖和节流8. HTTP 状态码9. OSI 七层模型10. UDP 和 TCP,TCP 为什么更可靠11. GET 和 POST,POST 为啥要两次请求12. JS 与 TS 的区别13. TS 类型14. v-model 原理15. computed 和 watch 的区别与使用场景16. nextTick 使用场景和实现17. 事件总线18. 项目相关    1. 介绍 OJ 重构项目、人员规模、开发周期、你负责的内容    2. 为什么要重构    3. 重构时如何保证系统功能稳定性    4. 为什么选择 Pinia 而不是 Vuex    5. 组件库的选择考量    6. 介绍大模型对话组件,背景、出发点、开发周期    7. 流式传输协议怎么实现的    8. 虚拟滚动技术怎么实现的,开始与结束的索引怎么计算的19. 算法:最长递增子序列隔了一周挂了,有些没答上来,有些说的不够广不够深,算法看错题了(ಥ_ಥ)
点赞 评论 收藏
分享
评论
1
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务