VUE发布更新页面不刷新的缓存问题

378 阅读4分钟

vue只有一个index.html,其余都是js,每次发布加载的js都不一样,只要index.html不加缓存,js加缓存就可以了

请在Response Header中加入header,Request Header是不生效的

Cache-Control

Response Header,Request Header里的Cache-Control各个取值,代表着不同的含义。

RequestResponse解释
max-agemax-age设置缓存存储的最大周期,超过这个时间缓存被认为过期 (单位秒)。与Expires相反,时间是相对于请求的时间。
max-stale-表明客户端愿意接收一个已经过期的资源。可以设置一个可选的秒数,表示响应不能已经过时超过该给定的时间。
min-fresh-表示客户端希望获取一个能在指定的秒数内保持其最新状态的响应。
-s-maxage覆盖max-age或者Expires头,但是仅适用于共享缓存 (比如各个代理),私有缓存会忽略它。
no-cacheno-cache在发布缓存副本之前,强制要求缓存把请求提交给原始服务器进行验证 (协商缓存验证)
no-storeno-store缓存不应存储有关客户端请求或服务器响应的任何内容,即不使用任何缓存。
no-transformno-transform不得对资源进行转换或转变。Content-Encoding、Content-Range、Content-Type等 HTTP 头不能由代理修改。例如,非透明代理或者如Google's Light Mode可能对图像格式进行转换,以便节省缓存空间或者减少缓慢链路上的流量。no-transform指令不允许这样做
only-if-cached-表明客户端只接受已缓存的响应,并且不要向原始服务器检查是否有更新的拷贝
-must-revalidate一旦资源过期(比如已经超过max-age),在成功向原始服务器验证之前,缓存不能用该资源响应后续请求。
-proxy-revalidate与 must-revalidate 作用相同,但它仅适用于共享缓存(例如代理),并被私有缓存忽略
-must-understand一旦资源过期(比如已经超过max-age),在成功向原始服务器验证之前,缓存不能用该资源响应后续请求
-private表明响应只能被单个用户缓存,不能作为共享缓存(即代理服务器不能缓存它)。私有缓存可以缓存响应内容,比如:对应用户的本地浏览器
-public表明响应可以被任何对象(包括:发送请求的客户端,代理服务器,等等)缓存,即使是通常不可缓存的内容
-immutable
-stale-while-revalidate表明客户端愿意接受陈旧的响应,同时在后台异步检查新的响应。秒值指示客户愿意接受陈旧响应的时间长度
stale-if-errorstale-if-error表示如果新的检查失败,则客户愿意接受陈旧的响应。秒数值表示客户在初始到期后愿意接受陈旧响应的时间

示例

禁止缓存 发送如下响应头可以关闭缓存。此外,可以参考Expires和Pragma消息头。

Cache-Control: no-store

缓存静态资源 对于应用程序中不会改变的文件,你通常可以在发送响应头前添加积极缓存。这包括例如由应用程序提供的静态文件,例如图像,CSS 文件和 JavaScript 文件。另请参阅 Expires 标题。

Cache-Control:public, max-age=31536000

需要重新验证 指定 no-cache 或 max-age=0, must-revalidate 表示客户端可以缓存资源,每次使用缓存资源前都必须重新验证其有效性。这意味着每次都会发起 HTTP 请求,但当缓存内容仍有效时可以跳过 HTTP 响应体的下载。

Cache-Control: no-cache
Cache-Control: max-age=0, must-revalidate

注意: 如果服务器关闭或失去连接,下面的指令可能会造成使用缓存。

Cache-Control: max-age=0

单页面应用中

入口文件index.html设置为协商缓存,每次都向服务器发起请求,确定资源是否过期。 其他的资源,css,js这些都会设置成强缓存。因为这些文件名在打包之后会带上hash值,如果修改了内容,那么打包之后因为hash值变化,所以文件名也是会变化的。这些文件在index.html里引入

IIS 发布

image.png

image.png

ngnix发布

 location ~ .*\.(html)$ {  // 对html文件限制缓存
      add_header Cache-Control no-store;  // 不缓存
     // 或者用add_header Cache-Control no-cache;替代上面那一句,协商缓存
      add_header Pragma no-cache;
    }

<meta>标签

开发者能否自己设置html等静态资源的请求头呢,目前没有发现这类方法。值得一提的是html里的<meta>标签,在旧版本里或许可以设置响应的请求头如: js复制代码

<meta http-equiv="cache-control" content="max-age=180" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
<meta http-equiv="pragma" content="no-cache" />

但这些方法在html5之后,是不会生效的。