解决微信浏览器缓存站点入口文件(IIS部署Vue项目)


Posted in Javascript onJune 17, 2019

最近开发的微信公众号项目中(项目采用Vue + Vux 构建,站点部署在IIS8.5上),遇到个非常奇葩的问题,发布站点内容后,通过微信打开网址发现是空白页面(后来验证是微信浏览器缓存了入口文件-index.html,顾之前版本的index页面找不到对应的js,因为我们每次发布会将之前的版本放至另外的备份目录),但关闭网页再次去打开又是正常的。最初开发内部测试时该问题没有引起关注,因为开发人员大部分都是android的手机,后来测试发现,某些android机型不是必现此问题,但是苹果(IOS)机型,每次都是必然发生。

百度千百回#

在客户反馈此问题后,如噩梦般的探索解决过程就此开始了。因为在开发机器上根本无法测试,每次都必须打包发布。并且,在问题发生后,团队内部最初讨论并不认为是缓存了站点的入口文件(某些android机型不会发生此现象),而是缓存了其他js文件,所以一开始的解决方向就是错误的,导致浪费了很多时间。

1. Vue项目打包发布时,文件加上版本号#

其实在用vue-cli 3.0脚手架构建的Vue项目,打包过程中输出的静态文件名已经做了hash处理, webpack.prod.conf.js 中配置如下:

output: {
  path: config.build.assetsRoot,
  filename: utils.assetsPath('js/[name].[chunkhash].js'),
  chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
 },

但我们还是尝试在此处加上时间戳,如:

'js/[id].[chunkhash]'+ new Date().getTime() +'.js'

结果是此方案没有生效,失败次数1。

2. 尝试将Vue-Router 的history模式改为hash模式#

这种思路,还是延续了前一种方案的错误思路,认为是浏览器缓存了某些js文件,由于js文件找不到报错,导致页面空白。想要通过路由的hash模式 + 文件的版本号,来解决此问题。因为我们的项目是采用的history模式(微信授权和站点部署在IIS某个子目录下的原因)。

后来验证这是完全的错误思路,失败次数2。

3. 路由跳转前拦截处理#

尝试此方案的时候,已经知晓产生该问题的原因,是由于微信浏览器缓存了入口文件(index.html),是想尝试在访问某个页面时,先执行跳转至加了版本号的index页面。具体实现思路:

router.beforeEach((to, from, next){
  // 实现某些跳转逻辑
}

因为最终的尝试失败了,这里就不再撰述逻辑,失败次数3。

4. 给微信公众号菜单链接加上特定版本号#

该方案只能是用于临时解决,内部做调测还可以,但如果用于正式生产环境,会非常麻烦,需要每次发布更新后,都去更改微信公众号的菜单链接。如下引用所示,在链接上加版本号:

http://yqwx.xx.com/index.html?vt=1234

因为这种方案,几乎不可能用于生产环境,失败次数4.

5. 尝试将站点部署到nginx上#

我们的项目是部署在IIS上的,但百度“微信浏览器缓存入口文件”问题,几乎所有文章中提到的网站都是部署在nginx上,有些解决此问题的方案,都是设置nginx,如以下几篇参考文中所例的设置:

location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|js)$ {
  root  /mnt/dat1/test/tes-app;
  #### kill cache
  add_header Last-Modified $date_gmt;
  add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
  if_modified_since off;
  expires off;
  etag off;
}

我们也尝试了安装nginx, 不过受项目其他因素影响,后来放弃了此方案,失败次数5。

蓦然回首,它在此处#

虽然以上几种解决方案的尝试,都以失败告终,但至少我们知晓了造成该问题的原因是由于微信浏览器缓存了站点入口文件(index.html),并尝试去从Web服务器(IIS)的配置去解决(因为在nginx上可以设置某些缓存,那么在IIS上应该也是可以的)。

最终的解决方案非常简单的,简单到我们都怀疑人生,哈哈。

在IIS中配置, 如下图所示:

解决微信浏览器缓存站点入口文件(IIS部署Vue项目)

解决微信浏览器缓存站点入口文件(IIS部署Vue项目)

解决该问题的过程是非常痛苦的,顾以此文记录,以示我们踩过的坑。

总结

以上所述是小编给大家介绍的解决微信浏览器缓存站点入口文件(IIS部署Vue项目),希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
在js文件中写el表达式取不到值的原因及解决方法
Dec 23 Javascript
jQuery在ie6下无法设置select选中的解决方法详解
Sep 20 Javascript
将鼠标焦点定位到文本框最后(代码分享)
Jan 11 Javascript
jQuery插件JWPlayer视频播放器用法实例分析
Jan 11 Javascript
详解前后端分离之VueJS前端
May 24 Javascript
vue使用xe-utils函数库的具体方法
Mar 06 Javascript
React为 Vue 引入容器组件和展示组件的教程详解
May 03 Javascript
JavaScript实现动态添加、移除元素或属性的方法分析
Jan 03 Javascript
layui 实现自动选择radio单选框(checked)的方法
Sep 03 Javascript
vue实现文字加密功能
Sep 27 Javascript
通过Kettle自定义jar包供javascript使用
Jan 29 Javascript
vue-路由精讲 二级路由和三级路由的作用
Aug 06 Javascript
通过说明与示例了解js五种设计模式
Jun 17 #Javascript
简单了解vue.js数组的常用操作
Jun 17 #Javascript
送你43道JS面试题(收藏)
Jun 17 #Javascript
通过实例学习React中事件节流防抖
Jun 17 #Javascript
如何解决js函数防抖、节流出现的问题
Jun 17 #Javascript
使用imba.io框架得到比 vue 快50倍的性能基准
Jun 17 #Javascript
通过js给网页加上水印背景实例
Jun 17 #Javascript
You might like
CI(CodeIgniter)框架介绍
2014/06/09 PHP
PHP中strlen()和mb_strlen()的区别浅析
2014/06/19 PHP
php中的常用魔术方法汇总
2016/02/14 PHP
WebGame《逆转裁判》完整版 代码下载(1月24日更新)
2007/01/29 Javascript
jquery索引在使用中的一些困惑
2013/10/24 Javascript
jQuery中scrollTop()方法用法实例
2015/01/16 Javascript
js代码实现无缝滚动(文字和图片)
2015/08/20 Javascript
JavaScript中的原始值和复杂值
2016/01/07 Javascript
浅谈几种常用的JS类定义方法
2016/06/08 Javascript
仿Angular Bootstrap TimePicker创建分钟数-秒数的输入控件
2016/07/01 Javascript
AngularJS基础 ng-show 指令简单示例
2016/08/03 Javascript
jQuery事件模型默认行为执行顺序及trigger()与 triggerHandler()比较实例分析
2020/04/30 jQuery
Vue SSR 即时编译技术的实现
2020/05/06 Javascript
[02:41]DOTA2英雄基础教程 谜团
2013/12/10 DOTA
[02:56]《DAC最前线》之国外战队抵达上海备战亚洲邀请赛
2015/01/28 DOTA
[01:28]一分钟告诉你DOTA2 TI9不朽宝藏Ⅱ中有什么!
2019/07/09 DOTA
Python多进程同步Lock、Semaphore、Event实例
2014/11/21 Python
Python写的英文字符大小写转换代码示例
2015/03/06 Python
深入学习Python中的上下文管理器与else块
2017/08/27 Python
Python3实现发送QQ邮件功能(文本)
2017/12/15 Python
python使用tkinter实现简单计算器
2018/01/30 Python
快速解决pandas.read_csv()乱码的问题
2018/06/15 Python
python 实现读取一个excel多个sheet表并合并的方法
2019/02/12 Python
一个可以套路别人的python小程序实例代码
2019/04/09 Python
pandas读取CSV文件时查看修改各列的数据类型格式
2019/07/07 Python
DJango的创建和使用详解(默认数据库sqlite3)
2019/11/18 Python
tensorflow 固定部分参数训练,只训练部分参数的实例
2020/01/20 Python
Python Selenium截图功能实现代码
2020/04/26 Python
浅谈Python中文件夹和python package包的区别
2020/06/01 Python
纯css3显示隐藏一个div特效的具体实现
2014/02/10 HTML / CSS
Lookfantastic台湾:英国彩妆美发保养购物网
2018/03/26 全球购物
应届毕业生的自我鉴定
2013/11/13 职场文书
电子技术专业中专生的自我评价
2013/12/17 职场文书
开会迟到检讨书
2014/01/08 职场文书
感恩教育月活动总结
2014/07/07 职场文书
java objectUtils 使用可能会出现的问题
2022/02/28 Java/Android