js缓存问题怎么解决

JavaScript010

js缓存问题怎么解决,第1张

面对的缓存问题有两个:一是页面引入的JS文件缓存。二是JS请求后台的缓存。对于第一种情况,有两种处理方式:

1、可以在页面引入的JS文件后面增加日趋,如果不经常改动的文件,可以在每次改动后修改后缀。

2、对于第二种情况,一般的处理方式是在请求的路径后面加上毫秒值,这样每次请求的路径都不一样,但是对于后台来说都是一样的,用来欺骗浏览器,进行实时请求,不调用浏览器缓存。

浏览器缓存策略分为两种 强缓存 (本地缓存) 和 协商缓存 (弱缓存)。

浏览器在发请求前,先检查强缓存,若没有需要的内容(未命中),则发起请求判断是否需要用弱缓存。

强缓存 是不发起请求,直接使用缓存内的内容的。浏览器将 js 、 css 、 image 、 font-family 等存到内存(存小文件)或者磁盘(存大文件)中,下次用户再访问的时候就从内存中取,以便提升性能。

协商缓存 需要往后台发请求, 通过判断来决定是使用协商缓存。如果请求内容没发生变化,则请求返回304(服务器收到请求,但内容无变化),浏览器就用缓存内的内容。

如果服务器返回的响应标头中包含 Expires (时间戳),那么客户端发起请求的时间在 Expires 之前的话,就触发强缓存。

服务器在上一次响应请求时,返回一个带 Last-Modified 的响应头,值为一个时间戳,表示该资源最后一次在服务器修改的时间。当客户端再一次请求这个资源的时候, 请求头就会带上 If-Modified-Since ,值为上次服务器发来的 Last-Modified , 服务器收到后,就和该资源最后修改时间比对, 没变化就返回304, 触发协商缓存。

弊端 : 时间间隔最小为1s,如果请求的资源在1s内发生了改变,是可能会触发协商缓存的, 导致无法获取到最新的资源。

为解决间隔最小1s的问题, If-None-Match 和 Etag 就诞生了。 Etag 是由服务器生成的, 是每个资源的唯一标识字符串, 随资源变化而改变。 判断过程和http1.0的一致,请求的时候携带 If-None-Match ,然后服务器比较这两个值,没变化就返回304, 触发协商缓存。

弊端 : 占用服务器资源较多, 虽然准确度高,但是性能上不如 Last-Modified &If-Modified-Since 的方法。不过实际的影响不会很大, 基本上可以忽略不计。

即便我们没有配置缓存策略,浏览器也会采用自己的算法来缓存资源。

nodejs清理谷歌浏览器缓存方法如下。

1、打开需清缓存的页面,再按F12调出开发模式框。

2、勾选Network标签下Disablecache选项。

3、按F5或右键重新加载刷新页面内容。

4、页面重新加载完成再按F12隐藏开发模式框即可清理谷歌浏览器缓存。