VUE项目发版后用户访问的仍然是旧页面?原因和解决方案都在这啦!

A系统(VUE项目)在版本迭代中,有时会出现打包上线后,用户仍然访问的是旧版本页面的现象。这时,用户需手动刷新,才能访问到新版本页面,影响用户体验。

这种现象出现的根本原因是浏览器缓存机制问题,那么,浏览器的缓存机制到底是怎样的?上述现象又该如何避免呢?

一、浏览器缓存机制

浏览器默认缓存机制‌主要包括两种类型:‌强缓存‌和‌协商缓存‌。

强缓存是指浏览器在加载网页时直接从本地缓存中读取资源,而不与服务器进行交互。强缓存主要通过设置HTTP响应头中的Expires和Cache-Control来实现。

协商缓存是指浏览器在加载资源时,先向服务器询问资源是否发生变化。如果服务器确认资源未变化,则返回304状态码,浏览器继续使用缓存中的资源;否则返回新的资源。协商缓存主要通过在HTTP响应头中设置Last-Modified和ETag来实现。

其中强缓存优先于协商缓存,而当没有设置缓存的时候浏览器默认的缓存策略为:

缓存时长 = (访问时间 - 最后一次修改时间) / 10

二、A系统针对浏览器缓存的既有解决方案

(一)对于JS、CSS等静态资源

A系统是基于vue-cli4脚手架开发的,其在每次Webpack打包过程中,会给生成的JS、CSS等静态资源文件名添加哈希后缀,并在index.html中引入带有相应哈希后缀的静态资源文件。

当版本无更新时,这些静态资源走浏览器缓存,当版本有更新时,浏览器会比对,重新请求,因此,每个版本的静态资源都是被正确引入的,不会因升级而出现缓存问题。

但是,public文件夹里的文件是不会被Webpack处理的,这些文件会直接被复制到目标目录,而我们的系统入口文件index.html就在public文件夹里。

也就是说,打包时,index.html文件是不会添加哈希后缀的,所以在版本更新后,依然会走浏览器缓存。

(二)对于动态数据

服务器端配置了Cache-Control:no-store,也就是说,所有接口内容浏览器都不会缓存,每次请求都是新请求。

三、A系统缓存方案优化

综上,可以猜想,A系统在版本迭代中有时会出现打包上线后用户仍然访问的是旧版本页面的现象,很可能是因为 其入口文件index.html在版本更新时会有缓存。

那么,怎么才能让index.html不被缓存呢?

要实现让静态资源被缓存,但让index.html不被缓存,则需要借助Nginx配置,通过设置针对index.html请求的header来控制缓存,具体配置如下:

js 复制代码
# 针对 index.html 设置不缓存
location = /index.html {
    add_header Cache-Control "no-cache, no-store, max-age=0, must-revalidate";
    add_header Pragma "no-cache";
    add_header Expires "0";
}

# 针对 JS/CSS等 文件设置缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
  add_header Cache-Control "public, no-transform";
}

Nginx配置上述代码后第一次发版,打开页面时,如果页面还在磁盘缓存阶段,未与服务器发生交互,则页面还是旧页面。这是因为,浏览器因之前的缓存策略,将上个版本的 index.html 缓存下来,即使服务器已经设置了新版本不缓存,浏览器还是优先使用本地磁盘缓存。但是后续再发版,就没有缓存问题了,也就不会再出现发版后用户访问的仍然是旧页面的现象了!

相关推荐
专注VB编程开发20年2 分钟前
asp.net IHttpHandler 对分块传输编码的支持,IIs web服务器后端技术
服务器·前端·asp.net
爱分享的程序员35 分钟前
全栈项目搭建指南:Nuxt.js + Node.js + MongoDB
前端
隐含1 小时前
webpack打包,把png,jpg等文件按照在src目录结构下的存储方式打包出来。解决同一命名的图片资源在打包之后,重复命名的图片就剩下一个图片了。
前端·webpack·node.js
lightYouUp1 小时前
windows系统中下载好node无法使用npm
前端·npm·node.js
Dontla2 小时前
npm cross-env工具包介绍(跨平台环境变量设置工具)
前端·npm·node.js
小妖6662 小时前
vue2 切换主题色以及单页面好使方法
前端·vue.js·elementui
胡桃夹夹子2 小时前
【前端优化】vue2 webpack4项目升级webpack5,大大提升运行速度
前端·javascript·vue.js·webpack·性能优化
Stringzhua2 小时前
JavaScript【7】BOM模型
开发语言·前端·javascript
阿幸软件杂货间2 小时前
谷歌浏览器(Google Chrome)136.0.7103.93便携增强版|Win中文|安装教程
前端·chrome
繁依Fanyi3 小时前
Animaster:一次由 CodeBuddy 主导的 CSS 动画编辑器诞生记
android·前端·css·编辑器·codebuddy首席试玩官