览器缓存究竟是什么?
浏览器缓存(Browser Caching)是为了加速浏览,浏览器在用户磁盘上对请求过的文档进行存储,当访问者再次请求这个页面时,浏览器就可以从本地磁盘显示文档,这样就可以加速页面的阅览。它是网站访问统计最难解决的问题之一。为了回收重复阅览网站而产生的资源浪费,而产生的机制。缓存的方式节约了网络的资源,提高了网络的效率。
为什么要清理缓存呢?缓存会带来哪些问题?
部署前端项目以后,你会发现一个问题(为什么必须刷新页面,页面才会更新到最新版本),其实就是因为服务器缓存的问题。缓存会导致你页面样式、图片或脚本等未能及时更新展示。
浏览器自身如何清理缓存呢?
以谷歌浏览器为例:按照下图指示:(也可使用快捷键直接唤起:Ctrl + Shift + Del)
清除缓存步骤1
清除缓存步骤2
vue项目中如何清理缓存呢?
1.在根目录下index.html的header头中添加一下代码:
vue不缓存-方式1
2.配置 nginx 不缓存 html
index.html在服务器端可能是有缓存的,需要在服务器nginx上配置不让缓存index.html
vue不缓存-方式2
名词解释:
no-cache:数据内容不能被缓存, 每次请求都重新访问服务器, 若有max-age(最大缓存期), 则缓存期间不访问服务器
no-store:不仅不能缓存, 连暂存也不可以(即: 临时文件夹中不能暂存该资源)
以上就是我本次分享的方式,各位同仁们还有什么好的方式可以下方留言,共同学习!
---携手共进,一同进阶!
者:kevinylzhao,腾讯音乐前端开发工程师
浏览器缓存策略对于前端开发同学来说不陌生,大家都有一定的了解,但如果没有系统的归纳总结,可能三言两语很难说明白,甚至说错,尤其在面试过程中感触颇深,很多候选人对这类基础知识竟然都是一知半解,说出几个概念就没了,所以重新归纳总结下,温故而知新。
浏览器缓存一般分为两类:强缓存(也称本地缓存)和协商缓存(也称弱缓存)。
浏览器发送请求前,会先去缓存里查看是否命中强缓存,如果命中,则直接从缓存中读取资源,不会发送请求到服务器。否则,进入下一步。
当强缓存没有命中时,浏览器一定会向服务器发起请求。服务器会根据 Request Header 中的一些字段来判断是否命中协商缓存。如果命中,服务器会返回 304 响应,但是不会携带任何响应实体,只是告诉浏览器可以直接从浏览器缓存中获取这个资源。如果本地缓存和协商缓存都没有命中,则从直接从服务器加载资源。
按照本地缓存阶段和协商缓存阶段分类:
上述代码的作用是告诉浏览器当前页面不被缓存,事实上这种禁用缓存的形式用处很有限:
a. 仅有 IE 才能识别这段 meta 标签含义,其它主流浏览器仅识别“Cache-Control: no-store”的 meta 标签。
b. 在 IE 中识别到该 meta 标签含义,并不一定会在请求字段加上 Pragma,但的确会让当前页面每次都发新请求(仅限页面,页面上的资源则不受影响)。
在 HTTP 请求和响应的消息报头中,常见的与缓存有关的消息报头有:
上图中只是常用的消息报头,下面来看下不同字段之间的关系和区别:
a. Last-Modified 标注的最后修改只能精确到秒级,如果某些文件在 1 秒钟以内,被修改多次的话,它将不能准确标注文件的新鲜度;
b. 某些文件也许会周期性的更改,但是它的内容并不改变(仅仅改变的修改时间),但 Last-Modified 却改变了,导致文件没法使用缓存;
c. 有可能存在服务器没有准确获取文件修改时间,或者与代理服务器时间不一致等情形。
浏览器可以在内存、硬盘中开辟一个空间用于保存请求资源副本。我们经常调试时在 DevTools Network 里看到 Memory Cache(內存缓存)和 Disk Cache(硬盘缓存),指的就是缓存所在的位置。请求一个资源时,会按照优先级(Service Worker -> Memory Cache -> Disk Cache -> Push Cache)依次查找缓存,如果命中则使用缓存,否则发起请求。这里先介绍 Memory Cache 和 Disk Cache。
200 from memory cache
表示不访问服务器,直接从内存中读取缓存。因为缓存的资源保存在内存中,所以读取速度较快,但是关闭进程后,缓存资源也会随之销毁,一般来说,系统不会给内存分配较大的容量,因此内存缓存一般用于存储较小文件。同时内存缓存在有时效性要求的场景下也很有用(比如浏览器的隐私模式)。
200 from disk cache
表示不访问服务器,直接从硬盘中读取缓存。与内存相比,硬盘的读取速度相对较慢,但硬盘缓存持续的时间更长,关闭进程之后,缓存的资源仍然存在。由于硬盘的容量较大,因此一般用于存储大文件。
下图可清晰看出差别:
200 from prefetch cache
在 preload 或 prefetch 的资源加载时,两者也是均存储在 http cache,当资源加载完成后,如果资源是可以被缓存的,那么其被存储在 http cache 中等待后续使用;如果资源不可被缓存,那么其在被使用前均存储在 memory cache。
CDN Cache
以腾讯 CDN 为例:X-Cache-Lookup:Hit From MemCache 表示命中 CDN 节点的内存;X-Cache-Lookup:Hit From Disktank 表示命中 CDN 节点的磁盘;X-Cache-Lookup:Hit From Upstream 表示没有命中 CDN。
从上图能感受到整个流程,比如常见两种刷新场景:
IndexedDB 就是浏览器提供的本地数据库,能够在客户端存储可观数量的结构化数据,并且在这些数据上使用索引进行高性能检索的 API。
异步 API 方法调用完后会立即返回,而不会阻塞调用线程。要异步访问数据库,要调用 window 对象 indexedDB 属性的 open() 方法。该方法返回一个 IDBRequest 对象 (IDBOpenDBRequest);异步操作通过在 IDBRequest 对象上触发事件来和调用程序进行通信。
常用异步 API 如下:
在 16 年曾基于 IndexDB 做过一整套缓存策略,有不错的优化效果:
SW 从 2014 年提出的草案到现在已经发展很成熟了,基于 SW 做离线缓存,让用户能够进行离线体验,消息推送体验,离线缓存能力涉及到 Cache 和 CacheStorage 的概念,篇幅有限,不展开了。
localStorage 属性允许你访问一个 Document 源(origin)的对象 Storage 用于存储当前源的数据,除非用户人为清除(调用 localStorage api 或者清除浏览器数据), 否则存储在 localStorage 的数据将被长期保留。
sessionStorage 属性允许你访问一个 session Storage 对象,用于存储当前会话的数据,存储在 sessionStorage 里面的数据在页面会话结束时会被清除。页面会话在浏览器打开期间一直保持,并且重新加载或恢复页面仍会保持原来的页面会话。
通过了解浏览器各种缓存机制和存储能力特点,结合业务制定合适的缓存策略,善用缓存是基本功,可以用于时常审查负责的业务,可能就会发现个别业务并没有运用到位,共勉。
、html页面会缓存吗?
单纯的html页面不会缓存,htm是一种标记语言,用来描述和标记的,不能实现缓存。html里面的JavaScript代码是当这个html页面加载时浏览器解释执行,也不可以实现数据缓存。
二、html 页面怎么对缓存进行设置
根据服务器系统环节的不同设置方法不一样
1、在Apache环境下
可以通过在.htaccess文件中添加下面的代码,设置图片的HTTP缓存和有效期(需要开启apache的headers模块支持):
其中max-age后面这个数字就是设置的缓存有效期(以秒为单位),比如上面的代码设置了网站的图片使用为期一年(秒)的HTTP缓存。
2、在Nginx下
可以通过修改nginx.conf配置文件,来修改缓存设置:
location~*\.(flv|gif|jpg|jpeg|png|ico|swf)${;access_logoff;break;}
注意:同样的方法,可以给js和css文件设置缓存。
html缓存:html5 应用程序缓存和浏览器缓存有什么区别
应用程序缓存是会预加载的,保证齐全地供应和保存。浏览器缓存没有这些控制,不能作为程序缓存使用。不幸地,应用程序缓存过於简单,导致效率不彰,预期将会被ServiceWorker取代。
*请认真填写需求信息,我们会在24小时内与您取得联系。