前端缓存相关

前端缓存

复习了一下前端常用的缓存相关知识顺便做了一次整理,有错误的地方还请大家多多指教。

目录


1. HTTP缓存

HTTP缓存是第二次请求资源开始的。
第一次请求时,资源正常返回,status为200,浏览器拿到资源的Response Header,其中包含了缓存的参数。
第二次请求时,浏览器先根据参数判断是否击中强缓存,击中则status为200,直接从本地缓存中获取资源。未击中则把Header中有关缓存的参数传给服务器,判断是否击中协商缓存,击中则status为304,仍旧从本地缓存中读取资源,未击中则重新从服务器中获取资源。

1.1 强缓存

与强缓存相关的参数有两个expires和cache-control。如果同时存在,cache-control比expires优先级高。

1.1.1 expires

这是一个GMT格式的时间字符串,例如Mon, 9 Sep 2018 22:30:59 GMT,如果请求的发送时间早于这个时间,则会击中强缓存。

1.1.2 cache-control

max-age=number

这是一个相对时间,单位为秒。以第一次请求的时间为准,加上max-age得出一个过期时间。下次请求时间弱小于过期时间则击中强缓存。

no-cache

不使用强缓存,直接向服务器请求,判断是否击中协商缓存。

no-store

禁止使用缓存,每次都向服务器重新请求资源。

public

可以被浏览器和CDN等中间代理服务器缓存。

private

只能被浏览器缓存,不能被中间代理服务器缓存。

1.2 协商缓存

两组成对出现的header,第一次请求时服务器的响应头有Last-Modified或Etag,之后浏览器再发送请求时会带上If-Modified-Since或If-None-Match。

1.2.1 Last-Modified和If-Modified-Since

第一次请求时服务器的响应头有Last-Modified,这是服务器上这个文件的最后修改时间,浏览器第二次请求时会带上If-Modified-Since,这个的值就是第一次收到的Last-Modified的值。
服务器在收到请求时会判断If-Modified-Since是否和服务器上文件的最后修改时间相同,相同则击中协商缓存,返回304,浏览器从本地缓存加载资源。如果没命中,则服务器重新返回新的资源并加上新的Last-Modified。

1.2.2 Etag和If-None-Match

Etag是服务器资源的唯一标识字符串,服务器上的资源一旦修改则会变化,使用流程和Last-Modified相同。两者同时使用时,Etag优先级高。
Etag可用于文件修改特别频繁的情况下,比如1秒修改N次,而Last-Modified只能追踪到秒级别。

1.3 主动让强缓存重新加载资源

因为强缓存不会发请求到服务器,所以若在周期内服务器上的文件做了修改,用户无法加载到最新的文件。
这时,可以通过修改页面中资源路径的形式,让浏览器主动加载新的资源。
例如:href=”test.css?v=1.0.1”

2. 浏览器缓存

项目 描述
cookies 容量4kb,浏览器每次发送请求时都会传递cookies给服务器,可以设置过期时间。
SessionStorage 容量5MB,当页面被关闭时会清除。
LocalStorage 容量5MB,永久存储。存储形式是字符串,如果需要存储对象,需要使用JSON.stringify()将对象变成字符串,使用时再用JSON.parse()将字符串转换回对象。
IndexDB 容量50MB,永久存储。

猜你喜欢

转载自blog.csdn.net/weixin_41459434/article/details/82558437