欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

前端性能优化之浏览器缓存

程序员文章站 2022-04-24 19:13:23
前端性能优化之缓存 前端性能优化有很多方式,今天我们主要学习下关于浏览器缓存的一些知识。 客户端缓存: session localstorage(需要注意安全问题,防篡改) cookie (数据存储...
前端性能优化之缓存

前端性能优化有很多方式,今天我们主要学习下关于浏览器缓存的一些知识。

客户端缓存:

session

localstorage(需要注意安全问题,防篡改)

cookie (数据存储尽量不要使用这种方式存放,请求时会增加头部重量)

图片采用wbp格式,占用体积小。

浏览器缓存

作用:

减少冗余的数据传输 减少服务器负担 加快客户端加载网页的速度

当客户端向浏览器发送请求的时候,如果没有缓存则直接请求服务器。如果有则根据缓存状态来是否从缓存中获取对应的文件。

强制缓存

利用expires和cache-control两个字段来控制

expires:是缓存过期时间(即资源过期时间),是个绝对值。所以如果客户端更改时间,会导致缓存混乱。所以http:1.1增加了cache-control:max-age字段,它是一个相对的时间。

cache-control与expires可以在服务端配置同时启用,同时启用的时候cache-control优先级高。

control:max-age=3600,代表着资源的有效期是3600秒

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

协商缓存

普通刷新会启动弱缓存(即协商缓存),忽略强缓存。

协商缓存涉及到两组header字段。

etag和if-none-match

last-modified和if-modified-since

etag和if-none-match

他们返回的是一个校验码,是个hash值。etag能够保证资源都是唯一的,是客户端请求服务器的时候服务器返回的。如果

资源变化了etag也会发生变化。当再次请求服务器的时候服务器根据浏览器上送的if-none-match(之前服务器返回的etag值)值来判断是否命中缓存。

last-modified和if-modified-since

浏览器第一次请求一个资源的时候,服务器返回的header中会加上last-modify,last-modify是一个时间标识该资源的最后修改时间,例如last-modify: thu,31 dec 2037 23:59:59 gmt。

当浏览器再次请求该资源时,request的请求头中会包含if-modify-since,该值为缓存之前返回的last-modify。服务器收到if-modify-since后,根据资源的最后修改时间判断是否命中缓存。

如果命中缓存,则返回304,并且不会返回资源内容,并且不会返回last-modify。

last-modified与etag是可以一起使用的,服务器会优先验证etag,一致的情况下,才会继续比对last-modified,最后才决定是否返回304。

etag的优势:

http1.1中etag的出现主要是为了解决几个last-modified比较难解决的问题:

一些文件也许会周期性的更改,但是他的内容并不改变(仅仅改变的修改时间),这个时候我们并不希望客户端认为这个文件被修改了,而重新get; 某些文件修改非常频繁,比如在秒以下的时间内进行修改,(比方说1s内修改了n次),if-modified-since能检查到的粒度是s级的,这种修改无法判断(或者说unix记录mtime只能精确到秒); 某些服务器不能精确的得到文件的最后修改时间。